如何将已登录(已认证)的用户分配给他们提交的表单数据?

时间:2019-04-20 09:26:08

标签: python django

我正在使用Django开发员工反馈界面。他们应能够登录并提出投诉。该投诉应该与提交投诉的用户一起作为属性存储在数据库中。

我试图以某种方式将用户传递给表单,以便表单保存经过身份验证的用户的用户名,但我无法将数据从视图传递给表单。 我已经能够将ModelChoiceField()集成到ModelForm中,但这可以使经过身份验证的用户操纵将与投诉相关联的用户名。

models.py:

from django.db import models
from django.contrib.auth.models import User


class Complaint(models.Model):
    complaint_text = models.CharField(max_length=1000, default='')
    switch_schedule_yes_or_no = models.BooleanField(default=True)
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)

views.py:

from .forms import ComplaintForm
from django.contrib.auth.decorators import login_required
from django.shortcuts import render


@login_required()
def complaint_view(request):
    form = ComplaintForm(request.POST)
    if form.is_valid():
        form.save()
        form = ComplaintForm()

    context = {
        'form': form,
    }
    return render(request, 'complaint.html', context)

forms.py:

from django import forms
from .models import Complaint
from django.contrib.auth.models import User


class ComplaintForm(forms.ModelForm):
    complaint_text = forms.CharField(max_length=1000)
    switch_schedule_yes_or_no = forms.BooleanField()
    user = forms.ModelChoiceField(queryset=User.objects.all())

    class Meta:
        model = Complaint
        fields = ['complaint_text', 'switch_schedule_yes_or_no', 'user']

如果可以通过某种方式进行设计,那么这是一种允许投诉与经过身份验证的用户相关联的方式,那就太了不起了!可以通过将参数从视图传递到表单,也可以使用用户专用的URL。我已经尝试解决这几天了。

干杯!

2 个答案:

答案 0 :(得分:2)

您可以使用request.user访问经过身份验证的用户并与您的Complaint对象关联。您不需要user表单中的ComplaintForm字段。

@login_required()
def complaint_view(request):
    form = ComplaintForm(request.POST)
    if form.is_valid():
        complaint = form.save(commit=False)  #don't commit to DB
        complaint.user = request.user  #access the user
        complaint.save()   # save and commit to DB
        form = ComplaintForm()

    context = {
        'form': form,
    }
    return render(request, 'complaint.html', context)

答案 1 :(得分:0)

尝试以下基于类的视图方法

在您的表单中,您可以省略以下行:

user = forms.ModelChoiceField(queryset=User.objects.all())

from django.views import generic

from my_app.forms import ComplaintForm

class ComplaintView(generic.CreateView):
    template_name = "complaint.html"
    form_class = ComplaintForm

    def form_valid(self, form):
        form.instance.user = self.request.user  # This is where what you want happens
        super().form_valid(form)

要添加登录所需的约束,可以使用LoginRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin

class ComplaintView(LoginRequiredMixin, generic.CreateView):
    pass