Django Admin,如何根据另一个选择填充选择选项

时间:2017-12-16 06:39:26

标签: django django-admin

我的情景:

我有三个表,分类,子类别,产品。 插入新产品时,有两个选择框

1)第一个选择是类别(工作)

2)第二个是Subcategory,它应与第一个选择相关。需要从子类别表中获取数据。

子类别表将类别ID作为外键。 我是初学者,请有人帮忙。

2 个答案:

答案 0 :(得分:3)

  

你必须使用我喜欢的一些JS库 JQuery

要填充此子类别字段,您必须创建一个将使用json数据进行响应的视图。

from django.http import HttpResponse
import json

def get_subcategory(request): 
    id = request.GET.get('id','') 
    result = list(Subcategory.objects.filter(category_id=int(id)).values('id', 'name')) 
    return HttpResponse(json.dumps(result), content_type="application/json") 

在urls.py,你需要添加一个模式来到达视图:

url(r'^/getSubcategory/$', views.get_subcategory) 

现在,您必须覆盖django admin的 change_from.html ,以便为您的产品应用添加一些JS代码来实现这一目标。

your_project
     |-- your_project/
     |-- myapp/
     |-- templates/
          |-- admin/
              |-- myapp/
                  |-- change_form.html  # do not misspell this
  

注意:此文件的位置并不重要。你可以把它   在你的应用程序内部,它仍然可以工作。只要它的位置可以   由django发现。更重要的是HTML的名称   文件必须与提供的原始HTML文件名相同   django的。

change_form.html 中,写下这样的事情:

{% extends "admin/change_form.html" %} 

{% block extrahead %}
    {{ block.super }} 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    <script type="text/javascript" charset="utf-8"> 
        $(function(){ 
            // inspect html to check id of category select dropdown.
            $(document).on('change', "select#id_category", function(){ 
                $.getJSON("/getSubcategory/",{id: $(this).val()}, function(j){ 
                     var options = '<option value="">---------</option>'; 
                     for (var i = 0; i < j.length; i++) { 
                         options += '<option value="' + j[i].id + '">' + j[i].name + '</option>'; 
                     } 
                     // inspect html to check id of subcategory select dropdown.
                     $("select#id_subcategory").html(options); 
                 }); 
             }); 
         }); 
    </script>
{% endblock %} 
# Create a JS file and put this second script tag in it, that way will be easier to maintain your template.

答案 1 :(得分:1)

url: path('features/',views.get_features,name='features'),
views: def get_features(request):
    id = request.GET.get('id','')
    cat = Category.objects.get(pk=id) 
    result = list(Feature.objects.filter(category=cat).values('id', 'name')) 
    print(result)
    return HttpResponse(json.dumps(result), content_type="application/json") 

javascript:             $(function(){ 
        // inspect html to check id of category select dropdown.
        $(document).on('change', "select#category_select_m1", function(){ 
            $.getJSON("features/",{id: $(this).val()}, function(j){ 
                 var options = '<option value="" disabled selected>Choose your feature</option>'; 
                 console.log(j);
                 for (var i = 0; i < j.length; i++) { 
                     options += '<option value="' + j[i].id + '">' + j[i].name + '</option>'; 
                 } 
                 // inspect html to check id of subcategory select dropdown.
                 $("select#feature_select_m1").html(options); 
             }); 
         }); 
     }); 

已针对django 2.1更新,但无法正常运行,这要感谢 Satendra 。我不能在上面发表评论,这就是为什么我提交问题作为答案

相关问题