2

メザニンのブログ投稿ごとに複数の著者を持つ可能性を実装するにはどうすればよいですか?

私の特定のケースでは、複数の人によって作成されるブログ投稿があります。

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

@ライトストライク

お返事とメールありがとうございます。アプリで対処しなければならない他の差し迫った問題があるため、STDBY でこの問題を抱えています。

他の問題をカスタマイズするためにフィールド インジェクションを試してみましたが、問題なく動作しました。

私の質問の問題について; M2M フィールドでフィールド注入を試みましたが、うまくいきませんでした。エラーは発生しませんでしたが、少なくとも期待どおりには機能しなかったため、他の問題に取り組み、この問題に戻ることにしました。ところで; フィールド インジェクションは 1 回だけ行ったので、どこかにタイプミスがある可能性もあります。次に進む必要があるため、デバッグや再考はまったく行われませんでした。

以下は、OOT に見えるかもしれませんが、ちょっと待ってください!

幸いなことに、私のアプリには、いくつかの基本的なワークフロー コントロールも必要です。箱から出してすぐに機能するこのソリューションを見つけました。はい、そうでした!

Mezzanine Users Groupの記事からこのアプリについて知りました。このリンクは、どこかにあることは知っていますが、必要なときに見つけることはできません。とても目からうろこなので探して読んでみてください。また、レニーが付けた名前が実際に間違っていることもわかりますが、私も英語を話さないので、翻訳すると正しい名前を思いつくのが難しい場合があるため、彼のことは理解しています. レニーはイタリア人のようで (勝手な推測です!)、私はスペイン語を話します。私は(今では)よく知っていますが、「編集者」は私が使っていた名前かもしれません.

繰り返しますが、この質問の問題に戻る時間がありませんでしたが、

  • IT WORKS、それが重要です。コードでアクセス許可を作成し、エンドユーザーにそれらのアクセス許可を使用させることで、開発者が使いやすくすることができると思います (必要な場合)。この時点で、ワークフローの「魔法」を実現するためにグループを作成する必要があります (詳細については、彼の README.md を参照してください)。
  • 繰り返しますが、これは単なるアイデアです。コードを詳しく調べたことさえありません。私はアプリを追加し、settings.py と出来上がりに半ダースほどの行を追加しました。
  • ここに契約があります: 彼がしていることは何でも (私は彼のコードを表面的にしか見ていません)、共同オーサリングを実装することもできると思います (admin.py の EditorBlogPostAdmin クラスの彼の save_model メソッドを調べてください)。
  • 解決策は、彼のコードから推測できるほど単純ではありませんが、これが正しい道であることがわかります。

ほんの 2 セントですが、うまくいけば今後 2 週間以内にこの問題に戻ります。

それにもかかわらず、他のことを試す前に、この議論をもう一度深く見ていきます.

どうもありがとう!!

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 関係を定義するという事実により、1 つの User オブジェクトに関連付けられた複数の Ownable オブジェクトが存在する可能性がありますが、複数の User オブジェクトを 1 つの Ownable オブジェクトに関連付けることはできません。BlogPost の作成者はこのように定義されるため、ブログ投稿ごとに 1 人の作成者しか存在できません。

ブログ投稿ごとに複数の作成者を許可するには、多対多 (M2M) フィールドを作成して、複数の User オブジェクトを 1 つの 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 のフィールド インジェクション ドキュメントからのいくつかのポインターを使用して(最初に提案したかったのですが、ManyToManyFields を使用して南部の移行を作成するときにいくつかの問題があります)、ベースの 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)

必要に応じて、さらに管理ロジックを追加する必要があるかもしれませんが、これで作業を開始できることを願っています。

于 2013-11-16T21:53:49.203 に答える