0

シンプルなブログ アプリの管理パネルにタグ リストを表示したいと考えています。ManyToManyFields は入力として許可されていないlist_displayため、タグを取得するメソッドを作成し、このメソッドをリストに入れたいと考えています。

私の問題は、モデルで他のクラスにアクセスする方法がわからないことです。

私のモデル.py

class Tag(models.Model):
    tag = models.CharField(max_length=25)

    def __unicode__(self):
        return self.tag


class Post(models.Model):
    author = models.ForeignKey(User)

    publication = models.DateTimeField()

    title = models.CharField(max_length=100)
    summary = models.TextField(max_length=150)
    content = models.TextField(max_length=9999)

    tag = models.ManyToManyField(Tag)

    commentsAllowed = models.BooleanField()

    def getTags(self):
        return Post.tag.all()    <-----------------------------------

    def __unicode__(self):
        return self.title

私のadmin.py

class PostAdmin(admin.ModelAdmin):
    date_hierarchy = 'publication'
    list_display = ('author', 'title', 'publication', 'getTags')

これは me を返します<django.db.models.fields.related.ReverseManyRelatedObjectsDescriptor object at 0xb8e24fcc>が、タグ名が必要です。

4

2 に答える 2

3

self.tags.all()クラスではなく、関係を持つインスタンスであるため、必要です。

于 2013-10-06T18:03:25.903 に答える
1

list_displayは、その項目がオブジェクト (インスタンス) または管理クラス メソッドのいずれかであることを期待しています。どちらの場合も、 にキャストできるものを返す必要がありますunicode

これを次のように管理クラスに入れたいと思います。

class PostAdmin(admin.ModelAdmin):
    list_display = ('tags',)

    def tags(self, obj):
        return u", ".join(obj.tag.all())

    def get_queryset(self, request):
        return super(PostAdmin, self).get_queryset(request).prefetch_related('tag')

get_querysetタグが単一のクエリを使用してプリフェッチされるように、クエリセットを変更するメソッドを追加しました。このおかげで、管理画面に表示されるx行に対するxクエリはありません。

于 2013-10-06T18:13:57.593 に答える