不幸的是,没有办法通过 Mezzanine 开箱即用地做到这一点。如果您使用Mezzanine Blog 应用程序查看 BlogPost 模型类,您将看到以下内容:
class BlogPost(Displayable, Ownable, RichText, AdminThumbMixin):
Ownable 的子类化是这里的重要因素。从 Blog 应用程序的 models.py 文件的第 6 行,我们知道 Ownable 类是从 Mezzanine 的 Core 应用程序导入的:
class Ownable(models.Model):
"""
Abstract model that provides ownership of an object for a user.
"""
user = models.ForeignKey(user_model_name, verbose_name=_("Author"),
related_name="%(class)ss")
class Meta:
abstract = True
def is_editable(self, request):
"""
Restrict in-line editing to the objects's owner and superusers.
"""
return request.user.is_superuser or request.user.id == self.user_id
由于 Ownable 定义了 ForeignKey 关系,单个 User 对象可以关联多个 Ownable 对象,但单个 Ownable 对象不能关联多个 User 对象。由于 BlogPost 的作者是这样定义的,因此每篇博文只能有一个作者。
为了允许每个博客文章有多个作者,您需要创建一个多对多 (M2M) 字段,以便多个 User 对象可以与单个 BlogPost 对象相关联。要做到这一点,不涉及更改 Mezzanine 源代码的最佳选择是通过继承 BlogPost 来创建自定义博客模型:
你的应用程序/models.py
from django.db import models
from mezzanine.utils.models import get_user_model_name
from mezzanine.blog.models import BlogPost
user_model_name = get_user_model_name()
class CollaborativeBlogPost(BlogPost):
"""
Custom model that subclasses Mezzanine's BlogPost to allow multiple authors
"""
authors = models.ManyToManyField(user_model_name)
def is_editable(self, request):
"""
Customize is_editable method originally defined in Mezzanine's
Ownable class to allow editing by all users
"""
return request.user.is_superuser or
request.user.id in self.authors.all().values_list('id', flat=True)
您还需要将新的协作博客文章添加到您的管理员。使用Mezzanine 的字段注入文档中的一些指针(我最初想建议,但在使用 ManyToManyFields 创建南迁移时存在一些问题),您可以复制基本的 BlogPost 管理员并添加作者字段:
你的应用程序/admin.py
from copy import deepcopy
from django.contrib import admin
from mezzanine.blog.admin import BlogPostAdmin
from mezzanine.blog.models import BlogPost
from .models import CollaborativeBlogPost
blog_fieldsets = deepcopy(BlogPostAdmin.fieldsets)
blog_fieldsets[0][1]["fields"].insert(-2, "authors")
class MyBlogPostAdmin(BlogPostAdmin):
fieldsets = blog_fieldsets
admin.site.register(CollaborativeBlogPost, MyBlogPostAdmin)
根据您的需要,您可能需要添加更多管理逻辑,但希望这可以帮助您入门。