#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 Тем не менее, я проголосовал.