ModelAdmin排序?

7
使用Django Admin界面,如何确保HTML select multiple中的对象按某种顺序排序(最好是按字母顺序)?问题在于我有3个模型-CD、Song、Singer。在CD管理员仪表板上,Song是CD的内联,并且Singer是一个希望排序的manytomany字段!
我的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)
1个回答

3

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”的具体问题,但在你的情况下,你可以通过模型中的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类添加到模型中是否会有性能损失,因为需要进行两次排序。 - Chris Wherry
那就选择第一种选项吧。这是管理员填充查询集的方式。应用排序不会导致查询集被评估,因此我无法想象由于元类默认值而导致性能下降。 :P - Yuji 'Tomita' Tomita
正确答案是: def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "soloist": kwargs["queryset"] = Singer.objects.order_by('last_name') return super(SongInline, self).formfield_for_manytomany(db_field, request, **kwargs)与上述不同的仅有 db_field.name == "soloist"(而非 singer)和 MyModelAdmin = SongInline。 - Chris Wherry
糟糕,不一致性是不好的!formfield_for...仍然是直接从文档中获取的。谢谢。 - Yuji 'Tomita' Tomita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接