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,然后可以在自动完成视图中使用它来过滤城市查询集。请参阅文档以创建用于表单字段的自动完成视图。
希望对您有所帮助。
我只使用 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,然后可以在自动完成视图中使用它来过滤城市查询集。请参阅文档以创建用于表单字段的自动完成视图。
希望对您有所帮助。