2016-07-05 118 views
2

我有这样的一些链接外键关系:创造Django管理链表外键

class Continent(models.Model): 
    continent = models.CharField(max_length=30) 

class Country(models.Model): 
    country = models.CharField(max_length=30) 
    continent = models.ForeignKey(Continent) 

class City(models.Model): 
    city = models.CharField(max_length=30) 
    country = models.ForeignKey(Country) 

class Person(models.Model): 
    name = models.CharField(max_length=30) 
    continent = models.ForeignKey(Continent) 
    country = models.ForeignKey(Country) 
    city = models.ForeignKey(City) 

,并在人管理员创建新项目的看法,我想国家和城市的名单被改变基于选择什么大陆等 我试过LinkedSelect of django suit,但我认为这并不意味着这一点。 我读了一下django select2,但是我没有看到任何支持。 任何想法是否有一个可以提供帮助的软件包?


更新:我碰到this

这表明Django的聪明选择。我尝试过这个。有两个问题: - 它需要你修改模型,这是一个红色标志。 - 它以类别的形式显示列表,但仍允许您选择不合意的错误项目。 (show_all不适用于GroupedForeignKey)

我有一个好主意。因为我想用Django的自动完成光,如果我可以添加一个事件处理程序,说当你选择第一个列表中使用自动完成,然后修改第二个列表的自动完成URL中附加参数传递,那么整个链条会工作。我坚持的是当我更改url(data-autocomplete-light-url)时,它不起作用。我不知道如何触发它重新加载。

回答

1

幸运的是,这其实是part of django-autocomplete-light

您必须创建自己的表单(如果尚未完成):

class PersonForm(forms.ModelForm): 

    class Meta: 
     model = Person 
     fields = ('__all__') 
     widgets = { 
      'country': autocomplete.ModelSelect2(url='country-autocomplete' 
               forward=['continent']), 
      'city': autocomplete.ModelSelect2(url='city-autocomplete' 
               forward=['country']), 
     } 

更新您自动完成:

class CountryAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     if not self.request.is_authenticated(): 
      return Country.objects.none() 

     qs = Country.objects.all() 

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

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

     if self.q: 
      qs = qs.filter(country__istartswith=self.q) 

     return qs 

class CityAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     if not self.request.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(city__istartswith=self.q) 

     return qs 

并使用新的形式在您的ModelAdmin:

class PersonAdmin(admin.ModelAdmin): 
    form = PersonForm 
+0

它很好用!谢谢。 – max