I am working with a form and model containing two foreign keys from other models. The two fk fields need to be displayed as choices in the template. I was able to do this, the form gets rendered just fine, however, there is an error when trying to save it. A couple posts were informative but none did solve my issue. It seems that the issue is not where I searched for, or at least I am unable to locate and fix it.
here is what I have for 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")
And here is my 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)
and finally here is the forms.py file
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"
)
This output the following error when trying to save the form to db
Cannot assign "'Gummies'": "Sales.SaleProductName" must be a "Products" instance.
I am unfamiliar with this issue and again, I could not find something that solved my issue. It's been now a couple days and I cannot identify what's wrong wit this code, any help would be greatly appreciated!
UPDATE: I came accross this post Cannot assign must be a instance Django so I tried modifying my fk in the model as such:
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)
the same error is getting output when trying to save the form