【问题标题】:Django Form - Select a valid choice. That choice is not one of the available choicesDjango Form - 选择一个有效的选项。该选择不是可用的选择之一
【发布时间】: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 而不是字符串。
  • 我认为错误与InvoiceItemFormproduct = forms.ModelChoiceField()有关
  • @JavierCárdenas 你解决了吗?我有同样的情况,但使用 ajax 的 select2

标签: django django-forms


【解决方案1】:

这是由于 Django 验证表单的方式造成的。

简而言之,它不期望回答一个它没有生成的选择。

在文档中: https://docs.djangoproject.com/en/1.11/ref/forms/fields/#choicefield

验证给定值是否存在于选项列表中。

在此站点上进行简单的“Django ajax 选择表单”搜索将为您返回一些可能的解决方法。

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2021-04-12
    • 2020-05-26
    • 1970-01-01
    • 2016-05-18
    • 2012-01-22
    • 2018-08-13
    • 2020-10-30
    • 2014-06-24
    相关资源
    最近更新 更多