[英]How can I assign the logged in (authenticated) user to the form data they submit?
我正在使用 Django 開發員工反饋界面。 他們應能夠登錄並提交投訴。 該投訴應該與提交它的用戶一起存儲在數據庫中作為屬性。
我試圖以某種方式將用戶傳遞給表單,以便表單保存經過身份驗證的用戶的用戶名,但我無法將數據從視圖傳遞到表單。 我已經能夠將 ModelChoiceField() 集成到 ModelForm 中,但這讓經過身份驗證的用戶可以操縱投訴將與之關聯的用戶名。
模型.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)
視圖.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)
表格.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。 我一直試圖解決這個問題好幾天了。
干杯!
您可以使用request.user
訪問經過身份驗證的用戶並與您的Complaint
對象關聯。 您不需要ComplaintForm
表單中的user
字段。
@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)
嘗試以下基於類的視圖方法
在您的表單中,您可以省略這一行:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.