Сохранение FK при отправке сообщения в django
Здравствуйте, у меня проблема с сохранением fk в таблице Infringer при добавлении записи. Я пытаюсь сохранить ID клиента при добавлении записи. Для устранения неполадок я добавил несколько строк печати и вот что получилось. Как вы можете видеть ниже, правильный ID клиента присутствует, но клиента нет, поэтому он не сохраняется в записи. Другие поля сохраняются нормально. ПОЖАЛУЙСТА, ПОМОГИТЕ! Я новичок.
customer в файле forms.py равен 2
экземпляр forms.py был сохранен с клиентом None
customer в файле views.py равен 2
Удалось сохранить нарушителя в файле views.py с его клиентом None
views.py
@login_required(login_url='login') def createInfringer(request): customer=request.user.customer form = InfringerForm(customer=customer) if request.method == 'POST': customer=request.user.customer.id form = InfringerForm(customer, request.POST) if form.is_valid(): saved_instance = form.save(customer) 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') context ={'form': form} return render (request, 'base/infringement_form.html', context)
forms.py
class InfringerForm(ModelForm): class Meta: model = Infringer fields = ['name', 'brand_name','status'] def __init__(self, customer, *args, **kwargs): super(InfringerForm,self).__init__(*args, **kwargs) self.fields['status'].queryset = Status.objects.filter(customer=customer) def save(self, customer, *args, **kwargs): instance = super(InfringerForm, self).save( *args, **kwargs) if customer: print (f'customer in forms.py is {customer}') self.customer = customer instance.save() print (f' forms.py instance was saved with the customer {instance.customer}') return instance
Возможно, стоит упростить форму, например, так:
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)
После этого мы можем упростить логику представления до:
@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})
Таким образом, мы используем клиента, а не его первичный ключ, и нам больше не нужно передавать клиента в метод .save()
.