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

#python #django

#python #django

Вопрос:

Я разрабатываю интерфейс обратной связи с сотрудниками с помощью 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-адресов. Я уже несколько дней пытаюсь решить эту проблему.

Приветствия!

Ответ №1:

Вы можете использовать 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. Спасибо, это было очень полезно 🙂 это сработало.

Ответ №2:

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

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

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
  

Комментарии:

1. Мое голосование пока не учитывается, так как у меня очень низкая репутация: D Тем не менее, я проголосовал.