django smart-selects 应用

3 投票
3 回答
3605 浏览
提问于 2025-04-17 12:31

我在使用django的“smart-selects”这个应用时遇到了问题。它无法正确填充我的链式字段的选择框。GitHub上的“readme”文件“https://github.com/digi604/django-smart-selects”给出了以下说明。

  • 链式字段是指在同一个模型中,应该与之关联的字段。
  • 链式模型字段是指与链式字段关联的模型中的字段。

我觉得这些说明有点难懂,而且没有展示关于大陆和县的模型,这让我理解起来更困难。

我之前也发过一个相关的问题,但没有得到回复。那个问题里有更多关于我具体模型的信息。“http://stackoverflow.com/questions/9155350/django-smart-selects-second-level-wont-populate”

希望能有一些“django-smart-selects”的专家能帮我解决这个问题。谢谢!

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = ChainedForeignKey(
        Country, 
        chained_field="continent",
        chained_model_field="continent", 
        show_all=False, 
        auto_choose=True
    )
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)

3 个回答

0

在这个例子中,for country = ChainedForeignKey() 这个字段,chained_field="continent" 是指 Location 类里的 "continent" 字段。而 chained_model_field="continent" 是指 Country 模型里面的一个 "continent" 字段(这个字段在例子中没有展示出来)。

0

我理解是这样的,dragonx。不过我显然还有些没明白。

我在想其他的类应该是这样的:

class Continent(models.Model):
    continent = models.CharField(max_length=45)    
    def __unicode__(self):
        return self.continent

class Country(models.Model):
    continent = models.ForeignKey(Continent)
    country = models.CharField(max_length=45)
    def __unicode__(self):
        return self.county

在国家类中,“continent”是一个整数字段,它对应着大陆类中的ID字段(外键/字段),这个字段用来进行连接。你也是这么理解的吗?

2

你需要在urls.py文件中添加这一行:

url(r'^chaining/', include('smart_selects.urls')),

我就是这么做的,结果成功了:

#=================================
#models.py

from smart_selects.db_fields import ChainedForeignKey 

class Continent(models.Model):
    continent = models.CharField(max_length = 45)    
    def __unicode__(self):
        return unicode(self.continent)

class Country(models.Model):
    continent = models.ForeignKey(Continent)
    country = models.CharField(max_length = 45)
    def __unicode__(self):
        return unicode(self.country)

class Area(models.Model):
    country = models.ForeignKey(Country)
    area = models.CharField(max_length = 45)
    def __unicode__(self):
        return unicode(self.area)

class Location(models.Model):
    continent = models.ForeignKey(Continent)
    country = ChainedForeignKey
    (
        Country, 
        chained_field = "continent", 
        chained_model_field = "continent", 
        show_all = False, auto_choose = True
    )
    area = ChainedForeignKey(Area, chained_field = "country", chained_model_field = "country")
    city = models.CharField(max_length = 50)
    street = models.CharField(max_length = 100)

#=================================
#admin.py


from yourapp.models import Continent
from yourapp.models import Country
from yourapp.models import Area
from yourapp.models import Location


class ContinentAdmin(admin.ModelAdmin):
    pass

class CountryAdmin(admin.ModelAdmin):
    pass

class AreaAdmin(admin.ModelAdmin):
    pass

class LocationAdmin(admin.ModelAdmin):
    pass

admin.site.register(Continent, ContinentAdmin)
admin.site.register(Country, CountryAdmin)
admin.site.register(Area, AreaAdmin)
admin.site.register(Location, LocationAdmin)

撰写回答