Джанго выпадающая зависимость от администратора - PullRequest
0 голосов
/ 25 января 2019

Я использую только административный интерфейс django, и у меня проблема в том, что, когда кто-то выбирает в качестве примера "страну", я хочу показать на втором, выберите "город" этой страны. Я уже сделал, мой файл 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

МОИ URL

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 ,

1 Ответ

0 голосов
/ 25 января 2019

Вы можете попробовать использовать автозаполнение django light. Вот документы .

Это даст вам возможность отображать опции в дочернем фильтре на основе выбора в родительском фильтре с помощью его параметра forward.

Создайте класс формы с полями города и страны, а затем перенаправьте поле в фильтр города как:

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, и его можно затем использовать в представлении автозаполнения для фильтрации набора запросов города. Пожалуйста, обратитесь к документации для создания представлений автозаполнения, которые будут использоваться для полей в форме.

Надеюсь, это поможет.

...