【问题标题】:creating linked lists in django admin for foreign keys在 django admin 中为外键创建链接列表
【发布时间】:2016-11-06 20:09:38
【问题描述】:

我有一些像这样的链式外键关系:

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 智能选择。我尝试过这个。有2个问题: - 它需要你修改模型,所以这是一个红色标志。 - 它以类别的形式显示列表,但它仍然允许您选择不希望的错误项目。 (show_all 不适用于 GroupedForeignKey)

我有个好主意。由于我想使用 django-autocomplete-light 使用自动完成功能,如果我可以添加一个事件处理程序,说明当您选择第一个列表时,然后修改第二个列表的自动完成 url 以传入一个附加参数,那么整个链将工作。我坚持的事情是,当我更改 url (data-autocomplete-light-url) 时,它没有生效。我不知道如何触发它重新加载。

【问题讨论】:

    标签: django django-admin django-autocomplete-light


    【解决方案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
    

    【讨论】:

    • 您能否编辑这篇文章以帮助新手了解哪些代码属于哪个文件?已经谢谢你了。 :)
    猜你喜欢
    • 2011-12-10
    • 2019-01-11
    • 2015-05-04
    • 2016-09-29
    • 2012-07-05
    • 2020-09-23
    • 2016-11-12
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多