【问题标题】:Django ModelChoiceField with instant filtered options带有即时过滤选项的 Django ModelChoiceField
【发布时间】:2011-03-18 14:12:11
【问题描述】:

我正在制作一个包含 3 个类的应用程序:员工、公司和部门。

当我编辑一个员工时,我需要了解他的公司,然后才能拥有一个包含所选公司所有部门的字段。但是当我使用 ModelChoiceField 时,我会看到所有公司的所有部门。

这不是特权问题。对于部门字段的验证,它需要是所选公司的部门。但是,我不想对此进行验证,我只需要显示在上面字段中选择的特定公司的部门。

由于它是客户端操作,我认为需要 javascript,所以我想知道它是否在 django 中以某种方式自动化,或者我需要为此目的下载 django-plugin 或 jquery-plugin。

感谢任何帮助,谢谢!

【问题讨论】:

  • 我会定义一个视图来过滤选定公司的部门。然后在公司变更时使用jQuery加载部门的combo。

标签: javascript django custom-fields


【解决方案1】:

这不是 django 内置的东西,需要一点点hacking,但我以前做过这种事情。

您需要将 jQuery AJAX 请求附加到公司选择字段的 onChange 事件。当有人选择一家公司时,您可以查询数据库并询问该公司特定的部门列表。

编辑:

类似以下 javascript 和 django 的东西可以工作:

$('#id_company').change(function(){
  $.POST('{% url some_url_name %}',
    {
      'company_id': $('#id_company').val()
    },
    function(data){
      if(data.valid){
        var d = '<select id="id_department" name="department">';
        $.each(data.records, function(k,v){
          d += '<option value="' + v.id + '">' + v.name +'</option>';
        });
        d += '</select>';
        $('#id_department').html(d);
      }
    }, 'json'
  );
});


def ajax_request(request, company_id):
  if request.is_ajax() and request.method == 'POST':
    data = simplejson.dumps(Department.objects.filter(company__id=company_id)
    return HttpResponse(data, mimetype='application/javascript')

【讨论】:

  • 我已将 def ajax_request 放入应用程序的 view.py 中。以及 .js 文件中的 js。我在哪里调用 ajax_request 方法?
  • 这不是一个方法,你只需将它添加到你的urls.py(重要的是给它一个名字,这样你就可以通过它的名字访问url)然后在js中,如上所示,使用 {% url name_of_ajax_request_url %} 输出ajax_request url的地址。
猜你喜欢
  • 2019-08-15
  • 2014-01-31
  • 2013-03-14
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多