2

如何在夹层中实现每篇博文拥有多个作者的可能性?

在我的特殊情况下,我的博客文章将由不止一个人撰写。

===========================

@lightstrike

感谢您的答复和电子邮件。我在 STDBY 上遇到了这个问题,因为我有其他更紧迫的问题需要在我的应用程序中处理。

我已经尝试过现场注入来定制其他问题,它们工作正常。

关于我的问题;我确实尝试过使用 M2M 场进行场注入,但它不起作用。我没有收到错误,但它没有工作,至少如预期的那样,所以我决定解决其他问题,然后再回到这个问题。顺便一提; 我只进行了一次现场注入,所以甚至可能是我在某处打错了字,绝对没有调试或重新考虑,因为我不得不继续前进。

以下可能看起来 OOT 但请坚持住!

好消息是,除其他外,我的应用程序还需要一些相当基本的工作流控制。我发现这个解决方案开箱即用。是的,它确实!

我从Mezzanine Users Group中的一篇文章中了解到这个应用程序,我知道我在某个地方有这个链接,但在我需要的时候永远找不到。请寻找并阅读,因为它非常令人大开眼界。你也会发现 Reny 给它起的名字确实是错误的,但我理解他,因为我也不会说英语,有时,当你翻译时很难想出正确的名字。Reny 似乎是意大利人(只是一个疯狂的猜测!)我会说西班牙语。我知道得更好(现在),但“编辑”很可能是我会使用的名字。

同样,我没有时间回到这个问题上,但是:

  • 它可以工作,这才是最重要的。我认为它可以做得更好,或者我应该说通过在代码中创建权限并让最终用户使用这些权限(如果需要)更容易被开发人员使用。到目前为止,您必须创建一个组以使工作流“神奇”地发生(阅读他的 README.md 了解更多信息)。
  • 这只是一个想法。我什至没有仔细研究过代码。我添加了应用程序,然后在 settings.py 中添加了大约六行,瞧,它起作用了!
  • 这是交易:我认为无论他在做什么(我只是对他的代码进行了表面研究)也可以实现协作创作(看看他在 admin.py 中 EditorBlogPostAdmin 类的 save_model 方法)
  • 解决方案不会像我从他的代码中推断出的那么简单,但有些事情告诉我这是正确的道路。

只是我的两分钱,但我希望在接下来的两周内回到这个问题,并且(希望)记得在这里发帖

尽管如此,在尝试其他任何事情之前,我还是会再次更深入地研究这个讨论。

非常感谢!!

4

1 回答 1

7

不幸的是,没有办法通过 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)

根据您的需要,您可能需要添加更多管理逻辑,但希望这可以帮助您入门。

于 2013-11-16T21:53:49.203 回答