首页 > 解决方案 > 如何将登录的(经过身份验证的)用户分配给他们提交的表单数据?

问题描述

我正在使用 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']

如果有可能以某种方式设计这是一种允许投诉与经过身份验证的用户相关联的方式,那将是惊人的!无论是通过将参数从视图传递到表单还是使用用户个人 URLS。这几天我一直在尝试解决这个问题。

干杯!

标签: pythondjango

解决方案


您可以使用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)

推荐阅读