Невозможно присвоить "'": "" должен быть "" экземпляром. ModelChoiceField
У меня есть форма, где пользователь может выбрать название объекта и затем сохранить его, но когда я нажимаю сохранить, я получаю ошибку. Я очень уверен, что эта проблема связана с тем, что я использую ModelChoiceField
, который возвращает ids
объектов, а не экземпляры этого объекта.
Итак, у меня есть две модели: InvoiceModel
class Invoice(models.Model):
line_one = models.ForeignKey(Inventory, on_delete=models.CASCADE, related_name='+', verbose_name="Line 1", blank=True, null=True, default='')
line_one_quantity = models.IntegerField('Quantity', default=0, blank=True, null=True)
line_one_unit_price = models.IntegerField('Unit Price(₹)', default=0, blank=True, null=True)
line_one_total_price = models.IntegerField('Line Total(₹)', default=0, blank=True, null=True)
Invoice.line_one
ссылается на Inventory.product_number
.
InventoryModel:
class Inventory(models.Model):
product_number = models.IntegerField(primary_key=True)
product = models.TextField(max_length=3000, default='', blank=True, null=True)
title = models.CharField('Title', max_length=120, default='', blank=True, null=True, unique=True)
amount = models.IntegerField('Unit Price', default=0, blank=True, null=True)
def __str__(self):
return self.title
InvoiceForm:
class InvoiceForm(forms.ModelForm):
line_one = forms.ModelChoiceField(queryset=Inventory.objects.values_list('title', flat=True), label="Line 1")
line_one_unit_price = forms.CharField(widget=forms.Select, label="Unit Price(₹)")
class Meta:
model = Invoice
fields = ['line_one',#...]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['line_one_unit_price'].widget.choices = [(i.amount, i.amount) for i in Inventory.objects.all()]
На самом деле у меня 10 строк, [т.е. line_two
и т.д.], но я просто вставляю код для первой строки здесь для простоты.
Я также хочу, чтобы в line_one
отображался только объем объекта, выбранного в line_one_unit_price
. Пожалуйста, дайте мне знать, если вы знаете, как этого добиться.
views.py:
@login_required
def add_invoice(request):
form = InvoiceForm(request.POST or None)
total_invoices = Invoice.objects.count()
queryset = Invoice.objects.order_by('-invoice_date')[:6]
if form.is_valid():
form.save()
messages.success(request, 'Successfully Saved')
return redirect('/invoice/list_invoice')
context = {
"form": form,
"title": "New Invoice",
"total_invoices": total_invoices,
"queryset": queryset,
}
return render(request, "entry.html", context)
Ошибка, которую я получаю:
Спасибо!
В атрибуте queryset внутри ModelChoiceField следует передать pk вместе с атрибутом, который вы хотите отобразить. Например:
forms.ModelChoiceField(queryset=Inventory.objects.values('pk','title'), label="Line 1")