gpt4 book ai didi

python - django 表单 : erorr passing model foreign into a form choice field

转载 作者:行者123 更新时间:2023-12-05 02:41:11 25 4
gpt4 key购买 nike

我正在处理一个包含来自其他模型的两个外键的表单和模型。这两个 fk 字段需要在模板中显示为选项。我能够做到这一点,表单呈现得很好,但是,在尝试保存它时出现错误。一些帖子提供了信息,但没有一个能解决我的问题。看来问题不在我搜索的地方,或者至少我无法找到并修复它。

这是我的 models.py

class Partners(models.Model):

PartnerName = models.CharField(max_length=100, primary_key=True)
PartnerCategory = models.CharField(max_length=100)
PartnerPhoneNumber = models.CharField(max_length=100)
PartnerEmail = models.CharField(max_length=100)
PartnerCompany = models.CharField(max_length=100, default='non')
PartnerAdressLine = models.CharField(max_length=100, default="NA")
PartnerZipCode = models.CharField(max_length=100, default="NA")
PartnerCity = models.CharField(max_length=100, default="NA")
PartnerState = models.CharField(max_length=100, default="NA")


def __str__(self):
return str(self.PartnerName)


class Products(models.Model):

ProductName = models.CharField(max_length=100, primary_key=True)
ProductUnit = models.CharField(max_length=100, default="NA")
ProductCategory = models.CharField(max_length=100)
ProductTagNumber = models.IntegerField(max_length=100)
StockOnHand = models.FloatField(max_length=100)

def __str__(self):
return str(self.ProductName)


class Sales(models.Model):
SaleID = models.AutoField(max_length=100, primary_key=True)
SaleProductName= models.ForeignKey(Products, on_delete=models.CASCADE)
SalePartnersName = models.ForeignKey(Partners,on_delete=models.CASCADE)
SalePartnerBusinessName = models.CharField(max_length=100,default="NA")
SaleQuantity = models.FloatField(max_length=100,default="NA")
SaleUnit = models.CharField(max_length=100,default="NA")
SaleNetAmount = models.FloatField(max_length=100)

SalePartnerCommission = models.FloatField(max_length=100)
SaleDate = models.DateField(default=datetime.date.today)
SaleStatus = models.CharField(max_length=100,default="Ongoing")

这是我的views.py

def RecordNewDealView(request):

if request.method == 'POST':
form = RecordNewDealForm(request.POST)
if form.is_valid():

form.save()
return redirect('my_deals.html')
else:
form = RecordNewDealForm()
context = {'form': form,}

return render(request, 'record_new_deal.html', context)

最后是forms.py文件

brokers_df = pd.DataFrame(list(Partners.objects.all().values()))
brokers = brokers_df[brokers_df['PartnerCategory'] == 'Broker']


items_list1 = brokers['PartnerName'].tolist()
items_list2 = brokers['PartnerName'].tolist()

CHOICES_OF_BROKERS = [list(x) for x in zip(items_list1, items_list2)]
CHOICES_OF_BROKERS.insert(0,('Not involved','Not involved'))


class RecordNewDealForm(forms.ModelForm):


SaleStatus = forms.CharField(widget=forms.Select(choices=SALE_STATUS_CHOICES))
SalesBroker = forms.CharField(widget=forms.Select(choices=CHOICES_OF_BROKERS))
SaleProductName = forms.ModelChoiceField(queryset=Products.objects.all().values_list('ProductName', flat=True))
SalePartnerName = forms.ModelChoiceField(queryset=Partners.objects.all().values_list('PartnerName', flat=True))
class Meta:
model = Sales
fields = ("SaleID",
"SaleProductName","SalePartnerName",
"SalePartnerBusinessName",
"SaleQuantity",
"SaleUnit","SaleNetAmount",
"SalePartnerCommission", "SaleDate"

)

尝试将表单保存到数据库时,输出以下错误

Cannot assign "'Gummies'": "Sales.SaleProductName" must be a "Products" instance.

我对这个问题不熟悉,而且我找不到解决我问题的方法。现在已经过去几天了,我无法确定这段代码有什么问题,将不胜感激任何帮助!

更新:我看到这篇文章 Cannot assign must be a instance Django所以我尝试在模型中修改我的 fk:

SaleProductName= models.ForeignKey(Products, related_name='products_catalogue', on_delete=models.CASCADE,  blank=True, null=True)
SalePartnersName = models.ForeignKey(Partners, related_name='partner_name', on_delete=models.CASCADE, blank=True, null=True)

尝试保存表单时出现同样的错误

最佳答案

我不是 Django 的专家。但是,我认为问题出在 forms.py 中的以下代码块中。

   SaleProductName = forms.ModelChoiceField(queryset=Products.objects.all().values_list('ProductName', flat=True))
SalePartnerName = forms.ModelChoiceField(queryset=Partners.objects.all().values_list('PartnerName', flat=True))

您正在尝试将字符串插入 ForeignKey 字段,这是不可能的。您要么必须按以下方式更改它。

   SaleProductName = forms.ModelChoiceField(queryset=Products.objects.all())
SalePartnerName = forms.ModelChoiceField(queryset=Partners.objects.all())

您可以更改 Product 和 Partners 模型中的 __str__ 方法以分别显示“ProductName”和“PartnerName”。

    def __str__(self):
return self.ProductName

否则,您可以保留 forms.py,因为它现在在 views.py 中处理此问题。但是,如果您还想使用此表单进行更新,则此方法会使问题复杂化。

关于python - django 表单 : erorr passing model foreign into a form choice field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68205601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com