Django形式的字段之间的依赖关系

时间:2016-09-15 14:24:28

标签: django django-forms

我有一个包含两个字段的表单,这两个字段基于两个模型。我需要的?如果选择特定类别,则只能选择与特定类别绑定的子类别。

表单

category = forms.ModelChoiceField(
    label='Category',
    queryset=Category.objects.all(),
    widget=forms.Select,
    required=False)

subcategory = forms.ModelChoiceField(
    label='Subcategory',
    queryset=SubCategory.objects.all(), #may be something like SubCategory.objects.filter(??????)
    widget=forms.Select,
    required=False)

1 个答案:

答案 0 :(得分:1)

Ajax / jQuery解决方案:

  1. 在模板末尾使用jQuery(包含jQuery文件到模板,例如从CDN调用),在选择类别后生成ajax get请求
    • 当模板将加载子类别字段时将被清除并且选择类别选项将被添加到其中
    • 当选择类别时,更改功能将在request_url上触发ajax GET请求
    • 所选类别(category_id)将传递给url而不是查看(请参阅第3点以了解视图运行后发生的事情)
  2. <script type='text/javascript'>
    $(function(){
      $('select[name=subcategory]').empty();
      $('select[name=subcategory]').prepend('<option value="Not selected" selected disabled>Select Category...</option>');
      // called when category field changes from initial value
      $('select[name=massage]').change(function(){
        if($("#id_category option:selected").text()) != (YOU SHOULD INSERT THE INITIAL VALUE OF THE CATEGORY FIELD WHEN IT IS NOT SELECTED) {
        category_id = $('select[name=category]').val();
        request_url = '/get_subcategory/' + category_id + '/';
          $.ajax({
            url: request_url,
            type: "GET",
            success: function(data){
              $.each(data, function(key, value){
                $('select[name=subcategory]').empty();
                $('select[name=subcategory]').append('<option value="' + key + '">' + value + '</option>');
              });
            }
          })
        }
      })
    });
    </script>
    
    1. 在urls.py中创建适当的url,当选择类别时,它将在jQuery中处理来自ajax的get请求:
    2. 在urls.py文件中

      url(r'^get_subcategory/(?P<category_id>[0-9]+)/$', views.get_subcategory, name='get_subcategory'),
      
      1. 现在在views.py中创建适当的视图,该视图将在之前的url获取请求之后运行:
        • 链接到所选类别的子类别(由category_id标识)将被过滤并发送回模板
        • 在ajax成功函数中(参见第1点)子类别下拉菜单将填充已过滤的子类别
      2. 在views.py文件中

        import json
        
        def get_subcategory(request, category_id):
            category = Category.objects.get(pk=category_id)
            subcategories = category.subcategory_set.all()
            subcategories_dict = {}
            for subcategory in subcategories:
            // if your subcategory has field name
            subcategories_dict[subcategory.id] = subcategory.name
            return HttpResponse(json.dumps(subcategories_dict), content_type="application/json")