夹层中每个帖子的多位作者

时间:2013-10-14 06:10:33

标签: python django mezzanine

如何实现在夹层中每个博客帖子中有多个作者的可能性?

在我的特定情况下,我将发布由多个人撰写的博文。

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

@lightstrike

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

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

关于我的问题;我确实尝试过使用M2M场进行现场注入,但它没有用。我没有得到错误,但它没有工作,至少按预期,所以我决定处理其他问题,然后回到这一个。顺便说说;我只注射了一次射门,所以甚至可能是我在某个地方有一个错字,绝对没有调试或第二次思考,因为我不得不继续前进。

以下可能看起来像OOT但仍然坚持!

好消息是,除其他外,我的应用程序还需要一些相当基本的工作流控制。我发现THIS SOLUTION开箱即用。是的,不是!

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

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

  • IT WORKS,这才是最重要的。我认为它可以做得更好 或者我应该说开发人员通过创建更容易使用 代码中的权限,并让最终用户使用这些权限(如果 需要)。到目前为止,你必须创建一个组来制作 工作流程“魔术”发生(阅读他的README.md了解更多信息)。
  • 这只是一个想法。我甚至没有查看过代码 详情。我添加了应用程序,然后是几十行 settings.py和瞧,它有效!
  • 这就是我们的交易:我认为无论他做什么(而且我 只有表面上看他的代码)也可以做到 实现协作创作(看看他的save_model admin.py中的EditorBlogPostAdmin类的方法
  • 解决方案不会像我从他的代码中推断的那样简单 但有些东西告诉我这是正确的道路。

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

然而,在尝试其他任何事情之前,我会再次深入研究这个讨论。

非常感谢!!

1 个答案:

答案 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来创建自定义博客模型:

yourapp / 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's field injection documentation中的一些指针(我最初想要建议但在使用ManyToManyFields创建South迁移时存在一些问题),您可以复制基本的BlogPost管理员并添加authors字段:

yourapp / 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)

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