Как я могу назначить вошедшего в систему (аутентифицированного) пользователя данными формы, которые они отправляют? - PullRequest
2 голосов
/ 20 апреля 2019

Я разрабатываю интерфейс обратной связи с 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 ]

2 голосов
/ 20 апреля 2019

Вы можете использовать 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)
0 голосов
/ 20 апреля 2019

Попробуйте следующее Подход на основе классов

В вашей форме вы можете пропустить эту строку:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...