0

Я разработал следующие модели для моего блогаDjango администратора InlineModels для manytomany полей

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 

и я пытаюсь зарегистрировать эту модель под Джанго администратора таким образом, что. Я могу редактировать категории, теги и авторы со страницы. но я с трудом, чтобы выполнить этот разговор, я написал этот код в файле 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,

ответ

1

Для использования AuthorInline, вы определены в ForeignKey поле в вас Автор модели

Ex:

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

Это означает, что один пост может иметь несколько авторов.

Но здесь, в вашей ситуации, у вас есть правильная модель и файлы, у которых есть один автор для одного сообщения, поэтому вы можете удалить 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 
+0

Но первый логик изменит мой бизнес-логику , так как я хочу, чтобы у автора могло быть много сообщений, как он может, но два автора не могут соавторировать сообщение. Для другого встроенного я проверил doc – shining

+0

. Затем вам нужно добавить в файл автора модель foreignkey feild и удалить поле автора в Post; или вы должны изменить автора feild как maytomany вместо foreignkey –

0

Это не то, для чего предназначены, и вы не хотите их здесь.

Врезки предназначены для обратного отношения: предоставлены автору, отредактируйте их данные и введите все их книги на одной странице. Ваши внешние ключи и поля «многие ко многим» лучше всего показывают как простые виджеты, что по умолчанию делает Django; автор и категория будут отображаться как раскрывающийся список, позволяющий вам выбрать элемент, а теги будут отображаться как поле с несколькими выборами.

Вы можете также выбрать для регистрации Книга как встроенная в Author admin; это зависит от вас.

+0

нет в моей почтовой странице, я могу увидеть POST_TITLE, post_body, автор как выпадающий список, обе категории и тег не показаны здесь – shining

0

Наконец я сделал то, что я хотел, главная суть в том, чтобы сделать категорию, автор и теги Choosable с поста страницы, так, чтобы сделать это, нам нужно добавить все поля в почтовой модели, которая является модифицированной моделью

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 
# 
Смежные вопросы