簡體   English   中英

如何將登錄(經過身份驗證)的用戶分配給他們提交的表單數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM