Сохранение клиента в фоновом режиме на формах django
Здравствуйте, я пытаюсь автоматически сохранять клиента в посте без необходимости указывать его в форме. В настоящее время он показывает выпадающий список и сохраняет правильно, но если я удаляю клиента из forms.py, он больше не сохраняется. Я думаю, что мне нужно добавить что-то в представлениях, но не уверен, что я упускаю?
views.py
@login_required(login_url='login')
def createInfringer(request):
customer=request.user.customer
form = InfringerForm(customer=customer)
if request.method == 'POST':
form = InfringerForm(customer, request.POST)
if form.is_valid():
form.save()
return redirect('infringer-list')
context ={'form': form}
return render (request, 'base/infringement_form.html', context)
forms.py
class InfringerForm(ModelForm):
def __init__(self, customer, *args, **kwargs):
super(InfringerForm,self).__init__(*args, **kwargs)
self.fields['customer'].queryset = Customer.objects.filter(name=customer)
self.fields['status'].queryset = Status.objects.filter(customer=customer)
class Meta:
model = Infringer
fields = ['name', 'brand_name','status','customer']
Если я правильно понимаю вашу проблему, вы хотите сохранить клиента в вашей модели, но не хотите показывать поле customer на вашей форме, поскольку клиент является зарегистрированным пользователем. Если это предположение верно, вам нужно сначала удалить поле customer из полей вашей формы и его метод __init__
. Затем вам нужно будет передать customer в метод сохранения во время запроса post, поскольку ваша модель, вероятно, требует это поле:
@login_required(login_url='login')
def createInfringer(request):
customer=request.user.customer
form = InfringerForm(customer=customer)
if request.method == 'POST':
form = InfringerForm(customer, request.POST)
if form.is_valid():
form.save(customer)
return redirect('infringer-list')
context ={'form': form}
return render (request, 'base/infringement_form.html', context)
class InfringerForm(ModelForm):
class Meta:
model = Infringer
# fields = ['name', 'brand_name','status','customer']
fields = ['name', 'brand_name','status'] # Notice the above commented line. Also, Add this instead
def __init__(self, customer, *args, **kwargs):
super(InfringerForm,self).__init__(*args, **kwargs)
# self.fields['customer'].queryset = Customer.objects.filter(name=customer)
self.fields['status'].queryset = Status.objects.filter(customer=customer)
def save(self, customer, *args, **kwargs):
instance = super(InfringerForm, self).save( *args, **kwargs)
if customer:
self.customer = customer
instance.save()
return instance
Я не тестировал приведенный выше код, но он должен работать
forms.py
class InfringerForm(ModelForm): class Meta: model = Infringer fields = ['name', 'brand_name', 'status'] def __init__(self, customer, *args, **kwargs): super().__init__(*args, **kwargs) self.customer = customer self.fields['status'].queryset = Status.objects.filter(customer=customer) def save(self, *args, **kwargs): self.instance.customer = self.customer return super().save( *args, **kwargs)
views.py
@login_required(login_url='login') def createInfringer(request): customer = request.user.customer form = InfringerForm(customer=customer) if request.method == 'POST': form = InfringerForm(customer, request.POST, request.FILES) if form.is_valid(): saved_instance = form.save() print (f'customer in views.py is {customer}') print (f'Successfully saved the infringer in views.py with its customer {saved_instance.customer}') return redirect('infringer-list') return render (request, 'base/infringement_form.html', {'form': form})