0

ブログ用に次のモデルを設計しました

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField(default='')
    created_at = models.DateTimeField('created date', auto_now_add=True, auto_now=False)
    updated_at = models.DateTimeField('updated date', auto_now_add=False, auto_now=True)
    author = models.ForeignKey('Author', default='admin')

    def __str__(self):
        return self.title


class Author(models.Model):
    name = models.CharField(max_length=150)
    email = models.EmailField(blank=True)
    bio = models.TextField()

    def __str__(self):
        return self.name

class Category(models.Model):
    cat_name = models.CharField(max_length=200)
    post = models.ManyToManyField('Post')

    def __str__(self):
        return self.cat_name

class Tag(models.Model):
    tag_name = models.CharField(max_length=200)
    post = models.ManyToManyField('Post')

    def __str__(self):
        return self.tag_name

そして、このモデルをdjango adminの下に登録しようとしています。投稿ページからカテゴリ、タグ、作成者を編集できます。しかし、私はこの話を達成するのに苦労しています.admin.pyファイルにこのコードを書きました

from django.contrib import admin
from .models import Post, Author, Tag, Category

class AuthorInline(admin.TabularInline):
    model= Author

class TagInline(admin.StackedInline):
    model= Tag

class CategoryInline(admin.StackedInline):
    model = Category

@admin.register(Post) #another method of registration admin.site.register(Post, PostAdmin)
class PostAdmin(admin.ModelAdmin):
    #Show the following fields in this order
    fields = ['body', 'title']
    #show the following filelds for nice formattng 
    list_display = ['title', 'author', 'created_at']
    #display based on the date hirerarchy
    date_hierachy = 'created_at'
    #embed the following child models in this parent models
    inlines = [AuthorInline, TagInline, CategoryInline,]

    #to exclude fields
    exclude = ('author',)

サーバーを実行すると、次のようなエラーが発生しました

ERRORS:
<class 'blogs.admin.AuthorInline'>: (admin.E202) 'blogs.Author' has no ForeignKey to 'blogs.Post'.
<class 'blogs.admin.CategoryInline'>: (admin.E202) 'blogs.Category' has no ForeignKey to 'blogs.Post'.
<class 'blogs.admin.TagInline'>: (admin.E202) 'blogs.Tag' has no ForeignKey to 'blogs.Post'.

エラーを調査するとき、モデルに外部キーがない場合、StackedInline クラスを使用できませんが、django admin の投稿ページの下にタグ、カテゴリ、および作成者のレンダリングされたフォームを配置するにはどうすればよいですか?

4

3 に答える 3

1

AuthorInline を使用するには、Author モデルにforeignkey フィールドを追加しました

元:

class Author(models.Model):
    post = models.ForeignKey('Post')

これは、1 つの投稿に複数の作成者が含まれる可能性があることを意味します。

しかし、ここでは、1 つの投稿に対して 1 人の作成者を持つ正しいモデルとフィールドがあるため、AuthorInline を削除できます。

タグとカテゴリの場合、多対多のフィールドを使用しています。このドキュメントを参照するとよいでしょうhttps://docs.djangoproject.com/en/dev/ref/contrib/admin/#working- with-many-to-many-models

CategoryInline と TagInline を書き直す必要があります。

class TagInline(admin.StackedInline):
    model= Tag.post.through

class CategoryInline(admin.StackedInline):
    model = Category.post.through
于 2015-12-15T10:20:37.047 に答える
0

最後に、私が望んでいた主な要点は、投稿ページからカテゴリ、作成者、およびタグを選択できるようにすることです。そのためには、変更されたモデルである投稿モデルにすべてのフィールドを追加する必要があります

from django.db import models
from django.utils import timezone

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(blank=True)
    bio = models.TextField()


class Tag(models.Model):
    tag_name = models.CharField(max_length=50)

class Category(models.Model):
    cat_name = models.CharField(max_length=50)

class Post(models.Model):
    '''post can have many categories 
    and categories can have many post
    author can have many post but post
    can have single author
    post can have many tags, and tags 
    can have many posts'''

    title = models.CharField('post title', max_length=200)
    body = models.TextField(default='', null=True)
    created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)
    author = models.ForeignKey(Author, verbose_name = "List of Author") #many to one relationship

    def __str__(self):
        return self.title

    #Generally many to many fields should into that model which is going to be edited.
    tags = models.ManyToManyField(Tag)
    categories = models.ManyToManyField(Category)

    class Meta:
        ordering = ['-created_at']
        verbose_name_plural = "Posteeees"


    # def post_status(self):
    # return timezone.now() - self.updated_at <= 1



#Recursive realation, we can define the foreignkey itself to the model  and this is called rrecursive realation
#
于 2015-12-16T03:34:22.917 に答える