Django form queryset filter using request user
Я хочу отфильтровать набор запросов, используя текущие данные пользователя, но он возвращает только None. Предположим, когда я удаляю None, он выдает ошибку user can't recognize
В Forms.py
class oldenquiryForm(forms.ModelForm):
class Meta:
model=enquiry
fields=['product','type','created_at']
widgets={
'created_at':forms.DateInput(attrs={'type':'date'}),
}
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
user = kwargs.pop('user', None)
super(oldenquiryForm, self).__init__(*args, **kwargs)
employee = emp.objects.filter(branch=user.admin.branch_name).values_list('firstname',flat=True)
print (employee)
self.fields['created_by'].queryset=emp.objects.filter(branch=user.admin.branch_name).values_list('firstname',flat=True)
Вы должны вызывать суперконструктор без поля user, удалив его из именованных параметров, например, добавив user=None к сигнатуре:
class OldEnquiryForm(forms.ModelForm):
def __init__(self,*args, user=None, **kwargs):
super(oldenquiryForm, self).__init__(*args, **kwargs)
if user is not None:
self.fields['created_by'].queryset = emp.objects.filter(branch=user.admin.branch_name)
class Meta:
model=enquiry
fields=['product','type','created_at']
widgets={
'created_at':forms.DateInput(attrs={'type':'date'}),
}
Затем в представлении вы создаете форму с зарегистрированным пользователем как user:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def enquirys(request):
if request.method == 'POST':
form = OldEnquiryForm(request.POST, request.FILES, user=request.user)
if form.is_valid():
form.save()
return redirect('name-of-some-view')
else:
form = OldEnquiryForm(user=request.user)
return render(request,'enquirys.html',{'form':form})
Возможно, вам также следует построить модель для филиала и использовать ForeignKey для реализации нормализации базы данных [wiki].
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_requiredдекоратора [Django-doc].
Примечание: В случае успешного POST запроса, вы должны сделать
redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.