【发布时间】:2017-12-30 18:05:22
【问题描述】:
我有一个表单集 (InvoiceItemForm),其中初始表单由 Django 创建,但是为了向表单集添加其他表单,我使用 Jquery。
在此表单内有一个选择字段 (product)。 select 的第一种形式是由ModelChoiceField 生成的,其余的都是使用 ajax 动态生成和填充的。
当我收到请求时,第一个(由 django 生成)没有问题,但其余的在产品字段中显示此 form.error:选择一个有效的选项。该选择不是可用的选择之一。
我做错了什么?我检查了表格,我没有看到ModelChoiceField 生成的表格和Jquery 生成的表格之间的区别
型号
class Invoice(models.Model):
number = models.CharField(max_length=200)
def __str__(self):
return self.number
class Product(models.Model):
description = models.CharField(max_length=200)
measurement_unit = models.CharField(max_length=200)
def __str__(self):
return self.description
class InvoiceItem(models.Model):
invoice = models.ForeignKey(Invoice, related_name='items')
product = models.ForeignKey(Product)
unit_price = models.DecimalField(max_digits=8, decimal_places=2, default=0)
quantity = models.DecimalField(max_digits=8, decimal_places=2, default=0)
Forms.py
class InvoiceItemForm(forms.Form):
product = forms.ModelChoiceField(queryset=Product.objects.all().order_by('description'))
unit_price = forms.DecimalField(max_digits=8, decimal_places=2,
widget=forms.TextInput(attrs={'placeholder': 'Precio', 'class': 'rate'}))
quantity = forms.DecimalField(max_digits=8, decimal_places=2,
widget=forms.TextInput(attrs={'placeholder': 'Cantidad', 'class':'quantity'}))
class InvoiceForm(forms.Form):
number = forms.CharField()
Views.py
def invoice(request):
InvoiceFormSet = formset_factory(InvoiceItemForm)
if request.method == 'POST':
invoice_form = InvoiceForm(request.POST)
formset = InvoiceFormSet(request.POST)
if invoice_form.is_valid():
# print("invoice number: ", invoice_form.cleaned_data['number'])
number = invoice_form.cleaned_data['number']
invoice = Invoice(number=number)
for form in formset:
print(form.errors)
用于填充选择字段的 Ajax
$.ajax({
url: '/ajax/get_products/',
type: 'GET',
data: {},
dataType: 'json',
success: function(data){
let selectItem = $(`#id_form-${total_forms-1}-product`)
selectItem.append(new Option("---------", "", false, false))
for (let i=0; i < data['products'].length; i++){
let p = data['products'][i][0] //product name
selectItem.append(new Option(p, p, false, false))
}
$('select').material_select()
}
})
【问题讨论】:
-
表单需要一个 Product 对象作为字段。您可能会返回 json 或其他选项。这个 'let p = data['products'][i][0]' 会给你带来什么?是字符串吗?
-
这是产品名称。一个字符串。
-
product = models.ForeignKey(Product) 应该是 Product 而不是字符串。
-
我认为错误与
InvoiceItemForm和product = forms.ModelChoiceField()有关 -
@JavierCárdenas 你解决了吗?我有同样的情况,但使用 ajax 的 select2
标签: django django-forms