Django 对管理员的下拉依赖

Django dropdown dependency on admin

我只使用 django 的管理界面,我有一个问题,当某人 select 例如“国家”时,我想在第二个 select 上显示 [= country.I 中的 42=] 已经完成,我的 json 文件在我的视图中,我想获取我的 json 文件并将其显示在 javascript 中,但我不知道怎么做。

我的申请:

myproject/
     |-- myproject
     |-- daa/
         |-- avarias/
            |-- models.py
     |-- mapeamento/
          |-- models.py
          |-- views.py
     |-- static/
          |-- daa/
            |-- avarias/
              |-- admin/
                |-- js/
                  |-- example.js     
     |-- templates/
          |-- admin/
              |-- daa/
                  |-- change_form.html

我的网址

urlpatterns = [
    path('', admin.site.urls, name ='home'),
    path('rua/list/', get_ruas, name='get_ruas'),

]

我的模特:

#Mapeamento Model

  class Freguesia(models.Model):
    id = models.IntegerField("Freguesia ID", primary_key=True)
    nome = models.CharField("Freguesia",max_length=200)

    def __str__(self):

        return  self.nome

  class Rua(models.Model):
    id = models.IntegerField("Rua id", primary_key=True)
    freguesia = models.ForeignKey(Freguesia, on_delete=models.CASCADE)
    nome = models.CharField("Rua",max_length=200)

    def __str__(self):

        return  self.nome
#daa/avarias Model
    from mapeamento.models import freguesia
    from mapeamento.models import rua

class Avaria(models.Model):
    freguesia = models.ForeignKey(Freguesia, on_delete=models.CASCADE,verbose_name="Freguesia")
    rua = models.ForeignKey(Rua, on_delete=models.CASCADE,verbose_name="Rua")

    def __str__(self,):

        return str(self.id)

我的MAPEAMENTO.VIEW

import json

from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from .models import Freguesia, Rua

def get_ruas(request): 
    freguesia_id = request.GET.get('freguesia_id')
    freguesia = get_object_or_404(Freguesia, pk=freguesia_id)
    res = Rua.objects.filter(freguesia=freguesia).order_by('nome').values('id', 'nome')
    result = {
        'ruas': list(Rua.objects.filter(freguesia=freguesia).order_by('nome').values('id', 'nome'))
    }
    return HttpResponse(json.dumps(result), content_type="application/json")

我的CHANGE_FORM.HTML

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

   {% block extrahead %}
   {{ block.super }} 
    <script 
    # DO SOMETHING
   </script>
   {% endblock %}

所以现在我不知道该怎么做,当我进入浏览器并输入 rua/list/?freguesia_id=10001 它正在工作,但现在我想在 select 上显示该值。

您可以尝试使用 django autocomplete light。这是 docs.

这将使您能够在其 forward 参数的帮助下,根据父过滤器中的选择在子过滤器中显示选项。

创建一个包含城市和国家字段的表单 class,然后将该字段转发到城市过滤器,如下所示:

class YourFormClass(forms.ModelForm):
    country = forms.ModelChoiceField(queryset=Country.objects.all(), 
                                 widget=autocomplete.ModelSelect2(url='your_country_auto_url'),
                                 )
    city = forms.ModelChoiceField(queryset=City.objects.all(),
                                    widget=autocomplete.ModelSelect2(url='your_city_auto_url',
                                                                     forward=['country']))

    class Meta:
        model = YourModel
        fields = '__all__'

部门视图:

class YourViewAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated():
            return City.objects.none()

        qs = City.objects.all()

        country = self.forwarded.get('country', None)

        if country:
            qs = qs.filter(country=country)

        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

这将转发选定的 country id,然后可以在自动完成视图中使用它来过滤城市查询集。请参阅文档以创建用于表单字段的自动完成视图。

希望对您有所帮助。