2017-02-23 68 views
0

我想在Django模板中构建一个动态表单。为什么我的Django窗体显示选择不可用错误?

我有两个下拉选择。当用户在第一个选项中选择一个选项时,第二个下拉列表中的可用选项会动态变化。以下是我用来更改第二个下拉元素中的选项的jQuery代码。

$(document).on("change", "[id^=id_form][id$=brand]", function() { 
    var $value = $(this).val(); 

    var $id_prefix = $(this).attr('id').slice(0, -5); 
    $auto_type = $("#" + $id_prefix + "auto_type"); 

    $.ajax({ 
     type: 'GET', 
     url: '/europarts/filter/auto/type/with/brand/' + String($value), 

     success: function(data) { 
      $auto_type.html(data); 
     } 
    }); 
}); 

你可以看到,它获取一些HTML从一个链接,基本上是一帮其将取代目前的那些选项。下面是代码:

{% for auto_type in auto_types %} 
    <option value="{{ auto_type.id }}">{{ auto_type.name }}</option> 
{% endfor %} 

这里是我的形式:

class ListForm(forms.ModelForm): 

    class Meta: 
     model = List 
     fields = ['ref_no'] 


class ProductCreateForm(forms.Form): 
    brand = forms.ModelChoiceField(queryset=Brand.objects.all(), initial=Brand.objects.first()) 
    auto_type = forms.ModelChoiceField(queryset=AutoType.objects.filter(brand=Brand.objects.first()), empty_label=None) 
    part_no = forms.CharField(max_length=50) 
    description = forms.CharField(max_length=255) 
    quantity = forms.IntegerField() 
    unit = forms.CharField(max_length=20, initial='piece(s)') 
    cost_price = forms.IntegerField(required=False) 
    selling_price = forms.IntegerField(required=False) 

我使用的是动态表单集jQuery库保存多个产品具有一个列表。

这工作很好,直到现在!

但是我改变这样的选项,并尝试提交表单后,表单页面被再次在第二个下拉,上面写着默认选项并没有改变那些与错误一起加载:

Select a valid choice. That choice is not one of the available choices. 

下面是提交表单时的request.POST值。

<QueryDict: {'form-MAX_NUM_FORMS': ['1000'], 'form-1-description': ['lskdjf'], 'form-1-auto_type': ['3'], 'form-MIN_NUM_FORMS': ['0'], 'form-0-quantity': ['1'], 'form-0-brand': ['2'], 'form-0-part_no': ['293847'], 'form-0-auto_type': ['2'], 'form-0-unit': ['piece(s)'], 'form-0-description': ['slkdfj'], 'form-1-part_no': ['928374'], 'form-TOTAL_FORMS': ['2'], 'form-1-quantity': ['1'], 'form-INITIAL_FORMS': ['0'], 'ref_no': ['REF230498203948'], 'csrfmiddlewaretoken': ['WYN08Hi2YhwTSKPS8EnLaz94aOz33RVfFMjwYeHr3rMxBImxn7ggSLYHwguIbuL0'], 'form-1-brand': ['2'], 'form-1-unit': ['pieces']}> 

你可以看到'form-1-auto_type': ['3']这是'form-1-auto_type': ['1']原本。表单在原始值存在时提交,但在动态更改值后显示上述错误。

第二个下拉菜单显示此错误。我怎样才能解决这个问题?

+0

是否要填写第二个选项中的选择或提交 – Cadmus

+0

您能否显示表单的代码? – albar

+0

@SnakeFcz选择。也许我的问题并不清楚。我设法动态更改第二个下拉列表的选项。但我无法提交表单,它会在动态更改时显示错误。 – MiniGunnR

回答

1

当被确认的形式,它会检查是否存在于选择字段的选择,在这种情况下:

queryset=AutoType.objects.filter(brand=Brand.objects.first()) 

当您从第一品牌的选择它才起作用。 要使其工作正常,您需要在验证数据之前更新auto_type字段的选项,或者可以更轻松地将auto_type的选项限制为任何品牌,然后在页面加载时仅更新页面中的select元素第一品牌的选择。

+0

我想我会尝试JavaScript方式来更新加载选项。如果有效,将接受答案。给我2分钟。 – MiniGunnR

+0

我正在使用Django Dynamic Forms创建多个表单。所以我认为使用JavaScript会很困难。我如何用Django更新查询集?当第一个下拉列表发生变化时,我向URL发送请求。我可以在该视图中添加一些代码来更改表单字段的查询集吗? – MiniGunnR

+0

没关系。我得到它的工作。我使用javascript代码:'$(document).ready(function(){0} {0} {0} {0} {0}html(''); \t \t});'谢谢你。 – MiniGunnR

相关问题