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

Bin*_*yak 6 django django-admin

我的情况:

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

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

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

子类别表具有类别ID作为外键。我是初学者,请帮助。

Sat*_*dra 6

您将不得不使用一些我喜欢的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") 
Run Code Online (Sandbox Code Playgroud)

您需要在urls.py上添加一个模式以到达视图:

url(r'^/getSubcategory/$', views.get_subcategory) 
Run Code Online (Sandbox Code Playgroud)

现在,您必须为产品应用覆盖django admin的change_from.html,以添加一些JS代码来完成此任务。

your_project
     |-- your_project/
     |-- myapp/
     |-- templates/
          |-- admin/
              |-- myapp/
                  |-- change_form.html  # do not misspell this
Run Code Online (Sandbox Code Playgroud)

注意:此文件的位置并不重要。您可以将其放入您的应用程序中,并且仍然可以使用。只要它的位置可以被django发现。更重要的是,HTML文件的名称必须与django提供的原始HTML文件名相同。

在您的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.
Run Code Online (Sandbox Code Playgroud)