我正在使用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。我已经尝试解决这几天了。
干杯!
答案 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