Django依赖选择

我知道这个问题有很多答案,但我是Django的新手,我不知道如何实现这些解决方案。 首先我想做什么。 这是我的模特:

class Region(models.Model): name = models.CharField(max_length=255, verbose_name=_("Name")) slug = models.SlugField(max_length=150, unique=True, null=True) def save(self,*args, **kwargs): if not self.slug: self.slug = slugify(self.name) super(Region,self).save(*args,**kwargs) def __unicode__(self): return u'%s' % (self.name) class Meta: verbose_name = _('Region') verbose_name_plural = _('Regions') class District(models.Model): name = models.CharField(max_length=255, verbose_name=_("Name")) slug = models.SlugField(max_length=150, unique=True, null=True) region = models.ForeignKey(Region,verbose_name=_("Region")) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super(District, self).save(*args, **kwargs) def is_in_region(self, region): if self.region == region: return True else: return False def __unicode__(self): return u'%s' % (self.name) class Meta: verbose_name = _("District") verbose_name_plural = _("Districts") 

在前端页面中,我想选择一个区域,选择区域将显示该区域的区域。 我的意见如下:

 class SearchView(ListView): template_name = 'advert/list_view.html' def all_json_models(self, request, region): current_reg = Region.objects.get(slug=region) districts = District.objects.all().filter(region=current_reg) json_models = serializers.serialize("json", districts) return http.HttpResponse(json_models, mimetype="application/javascript") def get(self, request, *args, **kwargs): return self.post(request, *args, **kwargs) def post(self, request, *args, **kwargs): self.request = request try: self.page = int(self.request.GET.get('page','1')) except: self.page = 1 self.queryset = "" return super(SearchView, self).get(request, *args, **kwargs) def get_queryset(self): """We have to bypass the queryset because we are joining several object lists together. """ return None def get_context_data(self, **kwargs): context['regions'] = Region.objects.all().order_by("name") return context 

get_context_data方法要长得多,但我在这里只写了一个简单的方法。 我在本网站上使用此解决方案http://www.devinterface.com/blog/en/2011/02/how-to-implement-two-dropdowns-dependent-on-each-other-using-django-and- jquery / 。 但仍然选择与地区不起作用。 我尝试在视图中将方法all_json_models写入此类,但仍然没有调用此方法。 在这里有谁能告诉我为什么? 多谢

好吧,我为你编写了一个完整的项目,希望这可以帮助:):
在这个项目中,我们有许多城市的国家
如图所示,每次选择一个国家/地区时,只显示下一个combobox中显示的相关城市:)

伊朗的城市

美国的城市

好吧,不,让我们看看代码
(完整的项目源代码在我的github上 : https : //github.com/nodet07/Django-Related-DropDowns )
models.py:
只有2个简单的模型,一个可以拥有多个城市的国家!

  from django.db import models class City(models.Model): name = models.CharField(max_length=50) country = models.ForeignKey("Country") def __unicode__(self): return u'%s' % (self.name) class Country(models.Model): name = models.CharField(max_length=50) def __unicode__(self): return u'%s' % (self.name) 

views.py:

 from django.shortcuts import render from map.models import * from django.utils import simplejson from django.http import HttpResponse def index(request): countries = Country.objects.all() print countries return render(request, 'index.html', {'countries': countries}) def getdetails(request): #country_name = request.POST['country_name'] country_name = request.GET['cnt'] print "ajax country_name ", country_name result_set = [] all_cities = [] answer = str(country_name[1:-1]) selected_country = Country.objects.get(name=answer) print "selected country name ", selected_country all_cities = selected_country.city_set.all() for city in all_cities: print "city name", city.name result_set.append({'name': city.name}) return HttpResponse(simplejson.dumps(result_set), mimetype='application/json', content_type='application/json') 

index.html:

            

我厌倦了非DRY解决方案,所以我写了一些可能足够灵活的东西用于大多数用例:

Django的相关选

现在它只处理在线/ AJAX相关的选择框。 我最终计划(可能在本周或下一周)添加一个离线模式,该模式将小部件渲染的JS推送到跟踪父级的onchange事件并通过值映射将其转换为子选项 – > list(选项) )。 AJAX解决方案非常适合汽车制造/模型(1000种选择),而离线解决方案非常适合产品/颜色(可能是10种选择)。

您可以使用链接的Jquery插件。

示例: http : //codepen.io/anon/pen/EapNPo?edit = 101

HTML

   

JS

 $("#id_city").chained("#id_country"); 

使用模型生成表单(ForeignKey)

转到https://axiacore.com/blog/django-y-selects-encadenados/完成教程