作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个包含来自其他模型的两个外键的表单和模型。这两个 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/
我是一名优秀的程序员,十分优秀!