在 django admin 中为外键创建链表
creating linked lists in django admin for foreign keys
我有一些像这样的链式外键关系:
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)
并在个人管理员创建新项目视图中,我希望根据 selected 等大陆更改国家和城市列表。
我试过 LinkedSelect of django suit 但我认为这不是为了这个。
我阅读了一些关于 django select2 的内容,但我没有看到任何支持。
有什么想法可以提供帮助吗?
更新:我遇到了 this
这表明 django smart selects。我尝试过这个。有两个问题:
- 它要求您修改模型,使其成为红色标志。
- 它以类别的形式显示列表,但它仍然允许您 select 不希望的错误项目。 (show_all 不适用于 GroupedForeignKey)
我有个好主意。因为我想使用 django-autocomplete-light 使用自动完成,如果我可以添加一个事件处理程序,说明当你 select 第一个列表时,然后修改第二个列表的自动完成 url 以传递一个附加参数,则整个链将起作用。我坚持的是,当我更改 url (data-autocomplete-light-url) 时,它没有生效。不知道怎么触发重新加载
幸运的是,这实际上是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
我有一些像这样的链式外键关系:
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)
并在个人管理员创建新项目视图中,我希望根据 selected 等大陆更改国家和城市列表。 我试过 LinkedSelect of django suit 但我认为这不是为了这个。 我阅读了一些关于 django select2 的内容,但我没有看到任何支持。 有什么想法可以提供帮助吗?
更新:我遇到了 this
这表明 django smart selects。我尝试过这个。有两个问题: - 它要求您修改模型,使其成为红色标志。 - 它以类别的形式显示列表,但它仍然允许您 select 不希望的错误项目。 (show_all 不适用于 GroupedForeignKey)
我有个好主意。因为我想使用 django-autocomplete-light 使用自动完成,如果我可以添加一个事件处理程序,说明当你 select 第一个列表时,然后修改第二个列表的自动完成 url 以传递一个附加参数,则整个链将起作用。我坚持的是,当我更改 url (data-autocomplete-light-url) 时,它没有生效。不知道怎么触发重新加载
幸运的是,这实际上是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