如何在django-admin中关联同一页面上的多对多关系?

时间:2015-09-23 08:05:27

标签: python django tags django-admin many-to-many

我是django的新手,我正在尝试创建一个简单的博客应用程序。

在我的models.py中,我为post,Commetns和tags定义了3个模型。

models.py

from django.db import models
from django.contrib.auth.models import User


# Create your models here.


class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField('post body')
    author = models.ForeignKey(User)
    pub_date = models.DateTimeField('date published')
    is_published = models.BooleanField(default=0)
    featured_image = models.CharField(max_length=200)
    created_date = models.DateTimeField('date created')
    updated_date = models.DateTimeField('date Updated')

    def __str__(self):
        return self.title


class Comment(models.Model):
    post = models.ForeignKey(Post)
    user = models.ForeignKey(User)
    comment_text = models.CharField(max_length=200)
    created_date = models.DateTimeField('date created')
    is_published = models.BooleanField(default=0)

    def __str__(self):
        return self.comment_text


class Tags(models.Model):
    title = models.CharField(max_length=200)
    post = models.ManyToManyField(Post)

    def __str__(self):
        return self.title

正如您所看到的那样,标签和帖子之间存在多对多的关系。

现在在博客模块的管理面板中,我希望用户能够在同一页面上添加帖子,评论和标签,即(创建或更新帖子时)。

我可以成功地为帖子和评论做到这一点, 但我不知道如何附加标签,以便我可以添加新标签并同时将它们附加到帖子。此外,我想使用select2插件作为标签字段。

我的 admin.py

from django.core import serializers
from django import forms
from django.http import HttpResponse
from django.utils import timezone
from django.contrib import admin
from .models import Post, Comment, Tags


# Register your models here.


class CommentsInline(admin.StackedInline):
    model = Comment
    extra = 1
    fields = ['comment_text']



class TagsInline(forms.ModelForm):
    # I am not sure what should i put in this class 
    model = Tags
    fields = ('title', )
    filter_vertical = ('post', )


class PostAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Content', {'fields': ('title', 'body', 'is_published')}),
        ('Date Information', {'fields': ('pub_date', )})
    ]

    inlines = [CommentsInline, TagsInline]



admin.site.register(Post, PostAdmin)

尝试运行上面的代码时,我总是看到这个错误:

  

'blog.Tags'拥有'blog.Post'

的关键词

2 个答案:

答案 0 :(得分:0)

您正在寻找的是嵌套的内联管理员。 Django没有开箱即用,但有一个包 - https://github.com/s-block/django-nested-inline。我几年前在django 1.5项目中使用它,它做了你想要的东西。

在回复您的评论时,错误消息是正确的。 TagPost之间没有直接的外键。 Django使用ManyToManyField的中间表。查看admin documentation for many-to-many models并查看是否可以帮助您。

答案 1 :(得分:-2)

在“标签模型”中为帖子字段指定相关名称。虽然Django为反向关系生成了默认的相关名称。我想这将是" post_set"。

post = models.ManyToManyField(Post, related_name="tags")

然后在后期使用的管理模型中

filter_horizontal = ('tags',)

您将看到一个很棒的小部件,可以在管理面板中添加标签。还有一个+按钮,可以动态添加新标签。

不使用TagsInline类。

PS:IMO你的Post模型应该包含与ManytoMany关系的标签字段,因为实际上post有标签而不是相反。虽然Django没有区分这两种情况。