0

複数の方法で表示できるデータがあります。さまざまな方法は、ユーザーがログインしているか匿名であるかによって異なり、ユーザーがログインしている場合は、ユーザーが投稿の作成者/読者であるかによって異なります。

私はdjangoクラスベースのビューとdjangoブレースを調べてきましたが、これに対処するための確立された答えを見つけていません. この種の意思決定はツリー構造になると想定しています。これまでに見たコードは、ユーザーのアクセス許可に応じてユーザーを URL に誘導し、ユーザーのアクセス許可に応じてさまざまな種類のデータを表示しません。権限/ログイン ステータス。

これに対処するための最良のアプローチは何ですか?または、これを処理する、見逃した、または見たことのないコードはありますか?

注: django クラス ベースのビューを使用したいと思います。

例えば:

stackoverflow の投稿にアクセスします。

投稿とコメントを表示します。

匿名ユーザーの場合、結合スタックオーバーフロー データ要素を表示します。

ログインユーザーの場合、作成者か非作成者かを確認します。

作成者の場合、編集投稿データ要素を表示します。

作成者でない場合は、編集投稿データ要素を表示しません。

上記の条件文をdjango CBVで正しく表現するにはどうすればよいですか?

4

1 に答える 1

1

私があなたなら、テンプレートでこれを行います:

{% if user == post.author %}
    display edit button
{% else %}
    display view button or something else
{% endif %}

もう 1 つのバリアント (ビューですべてのロジックを実行する場合) は、ミックスインを作成することです。

class CanEditMixin(object):
    def get_context_data(self, **kwargs):
        """
        The method populates Context with can_edit var
        """
        # Call the base implementation first to get a context
        context = super(CanEditMixin, self).get_context_data(**kwargs)
        #Update Context with the can_edit
        #Your logic goes here (something like that)
        if self.request.user == self.get_object().author
            context['can_edit']=True
        else:
            context['can_edit']=False
        return context

次に、ビューを更新する必要があります (順序が重要です)。

class PostDetailView(CanEditMixin, LoginRequiredMixin, DetailView):
    #your view

そしてあなたのテンプレート:

{% if can_edit %}
    display edit button
{% else %}
    display view button or something else
{% endif %}    

また、問題の詳細によっては、django object-level permission packagesに興味があるかもしれません。これらのパッケージを使用すると、ユーザーが特定のオブジェクトを編集するためのアクセス許可を追加できます。その場合、テンプレートに次のように記述できます。

{% if perms.post.can_edit %}
    display edit button
{% else %}
    display view button or something else
{% endif %}   

django docsへのリンク。

于 2013-03-06T15:53:16.817 に答える