Сохранение клиента в фоновом режиме на формах 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})
Вернуться на верх