我是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'
的关键词
答案 0 :(得分:0)
您正在寻找的是嵌套的内联管理员。 Django没有开箱即用,但有一个包 - https://github.com/s-block/django-nested-inline。我几年前在django 1.5项目中使用它,它做了你想要的东西。
在回复您的评论时,错误消息是正确的。 Tag
和Post
之间没有直接的外键。 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没有区分这两种情况。