【问题标题】:ModelAdmin sorting?ModelAdmin 排序?
【发布时间】:2011-08-12 00:36:46
【问题描述】:

使用 Django Admin 界面,如何确保 HTML select multiple 中的对象按某种顺序排序(首选字母顺序)?问题是我有 3 个模型 - CD、歌曲、歌手。在 CD 管理仪表板中,Song 是内联到 CD 中的,而 Singer 是我想要排序的多对多字段!

我的model.py 文件:

class CD(models.Model):

    cd_name = models.CharField("CD Name",max_length=50)
    date = models.DateField("CD Release Date")
    photo = models.ImageField("CD Cover",blank=True,upload_to='covers')
    singers = models.ManyToManyField(Singer,blank=True,null=True) 

    def __unicode__(self):
        return self.cd_name

class Song(models.Model):

    cid = models.ForeignKey(CD)
    track_num = models.PositiveIntegerField("Track Number",max_length=2) 
    song_name = models.CharField("Song Name",max_length=50)
    soloists = models.ManyToManyField(Singer,blank=True,null=True) 
    stream_url = models.URLField("Stream URL", blank=True)

    def __unicode__(self):
        return self.song_name

class Singer(models.Model): (not relevent)

我的admin.py 文件:

class SongInline(admin.TabularInline):
    model = Song
    extra = 0

class CDAdmin(admin.ModelAdmin):

    list_display = ('cd_name', 'date')

    inlines = [
        SongInline,
    ]

admin.site.register(CD, CDAdmin)

【问题讨论】:

    标签: django sorting modeladmin


    【解决方案1】:

    formfield_for_manytomany

    class SongInline(admin.TabularInline):
        model = Song
        extra = 0
    
        def formfield_for_manytomany(self, db_field, request, **kwargs):
                if db_field.name == "soloists":
                    kwargs["queryset"] = Singer.objects.order_by('last_name')
                return super(SongInline, self).formfield_for_manytomany(db_field, request, **kwargs)
    

    这回答了您关于“ModelAdmin 排序”的具体问题,但在您的情况下,您可以通过模型 ordering 模型元类选项为您的 m2m 模型简单地定义默认排序。

    http://docs.djangoproject.com/en/dev/ref/models/options/#ordering

    class Singer(models.Model):
        # my model
        class Meta:
            ordering = ['name'] # your select box will respect this as well.
    

    【讨论】:

    • 从性能角度来看,哪种方法更好?我在 view.py 中对 Singer 进行排序以显示在我的模板上。我想要的 ModelAdmin 排序方法与标准排序不同。只是想知道如果将 Meta 类添加到模型中,执行 2 种排序是否会影响性能?
    • 啊,那就选择第一个吧。这就是管理员填充查询集的方式。应用排序不会导致查询集被评估,所以我无法想象由于元类默认值而导致的性能损失。 :P
    • 正确答案是:def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "soloists": kwargs["queryset"] = Singer.objects.order_by(' last_name') return super(SongInline, self).formfield_for_manytomany(db_field, request, **kwargs) 从上面唯一的变化是 db_field.name == "soloist" (vs.singer) & MyModelAdmin = SongInline。
    • 糟糕,不一致很糟糕! formfield_for... 仍然直接来自文档。谢谢。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2017-08-06
    • 2017-05-24
    • 2018-08-26
    相关资源
    最近更新 更多