如何实现在夹层中每个博客帖子中有多个作者的可能性?
在我的特定情况下,我将发布由多个人撰写的博文。
==========================
@lightstrike
感谢您的回复和电子邮件。我在STDBY上有这个问题,因为我还有其他更紧迫的问题需要在我的应用程序中处理。
我已经尝试过现场注入来定制其他问题,但它们工作正常。
关于我的问题;我确实尝试过使用M2M场进行现场注入,但它没有用。我没有得到错误,但它没有工作,至少按预期,所以我决定处理其他问题,然后回到这一个。顺便说说;我只注射了一次射门,所以甚至可能是我在某个地方有一个错字,绝对没有调试或第二次思考,因为我不得不继续前进。
以下可能看起来像OOT但仍然坚持!
好消息是,除其他外,我的应用程序还需要一些相当基本的工作流控制。我发现THIS SOLUTION开箱即用。是的,不是!
我从Mezzanine Users Group中的一篇文章中了解到了这个应用程序。我知道我有一个链接,但是在我需要的时候却找不到。请仔细阅读并阅读,因为它非常开放。你也会知道Reny给它的名字确实是错的,但我理解他,因为我也不是说英语的人,有时,当你翻译它时很难想出正确的名字。 Reny似乎是意大利人(只是一个疯狂的猜测!)而且我是西班牙语演讲者。我知道更好(现在),但“编辑”可能是我将使用的名称。
同样,我没有时间回答这个问题,但是:
只是我的两分钱,但我希望在接下来的两周内回到这个问题,并且(希望)记得回到这里
然而,在尝试其他任何事情之前,我会再次深入研究这个讨论。非常感谢!!
答案 0 :(得分:7)
不幸的是,Mezzanine无法开箱即用。如果您使用Mezzanine Blog app查看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对象,但多个User对象无法与单个Ownable对象相关联。由于BlogPost的作者是以这种方式定义的,因此每个博客文章只能有一位作者。
为了在每篇博文中允许多位作者,您需要创建一个多对多(M2M)字段,以便多个User对象可以与单个BlogPost对象相关联。要做到这一点,不打算更改Mezzanine源代码的最佳选择是通过继承BlogPost来创建自定义博客模型:
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's field injection documentation中的一些指针(我最初想要建议但在使用ManyToManyFields创建South迁移时存在一些问题),您可以复制基本的BlogPost管理员并添加authors字段:
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)
根据您的需要,您可能需要添加更多管理逻辑,但希望这可以帮助您入门。