我在發布時在 Infringer 表中保存 fk 時遇到問題。我在添加記錄時試圖保存客戶 ID。出于故障排除目的,我添加了一些列印行,這就是輸出。正如您在下面看到的,存在正確的客戶 ID,但客戶為 None,因此它沒有保存到記錄中。其他欄位保存良好。請幫忙!我是初學者。
forms.py 中的客戶是 2
forms.py 實體與客戶一起保存 無
views.py 中的客戶是 2
成功將侵權者保存在 views.py 及其客戶 None
視圖.py
@login_required(login_url='login') def createInfringer(request): customer=request.user.customer.id form = InfringerForm(customer=customer) if request.method == 'POST': 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)
表單.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
模型.py
class Infringer (models.Model): name = models.CharField(max_length=200) brand_name = models.CharField(max_length=200, null=True) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) status = models.ForeignKey(Status, on_delete=models.SET_NULL,null=True) customer = models.ForeignKey(Customer, on_delete=models.SET_NULL,null=True) class Meta: ordering = ['-updated', '-created'] def __str__(self): return self.name
uj5u.com熱心網友回復:
它可能有助于簡化您的表單,例如:
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()方法中傳遞客戶。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/537045.html
標籤:Python姜戈形式外键
