3

サイトに送信されたコメントの横にある「削除」リンクを表示または非表示にする単純な Django テンプレート タグを作成しようとしていますが、無駄です。

簡単に言うと、コメント オブジェクトを template タグに渡し、現在ログインしているユーザーがコメントを削除する権限を持っているかどうかを判断し、リンクを表示するかどうかを決定します。

私のテンプレートでの使用法は次のようになります。

{% load access_tags %}
{% if_authorized comment %}
   <a href="{% url delete_comment comment.id %}">Delete</a>
{% endif_authorized %}

ユーザーがコメントを削除する権限を持っているかどうかも、適切なビューで確認しますのでご安心ください。

このタイプのタグには特定の名前がありますか? もしそうなら、それは確かに私のGoogle検索に役立つでしょう. ご協力いただきありがとうございます!

更新 1:

私のサイトの仕組みでは、2 人がコメントを削除できる可能性があります。1) コメントの作成者と 2) コメントが残された投稿の所有者です。このため、コメントごとに、これらの条件のいずれかが存在するかどうかを判断する必要があります。

Django の組み込みパーミッション システムのようなものは使用できないと思います。パーミッションを「特定のオブジェクト インスタンスごとではなく、オブジェクトのタイプごとにグローバルに設定する」必要があるためです。

私の場合、ユーザー「ボブ」はコメントを削除する権限を持っている可能性があります (彼が書いた、または作成した投稿にある場合) が、削除することも許可されていない可能性があります (彼が誰かのコメントを見ている場合)他人の投稿)。

更新 2:

オブジェクトをテンプレート タグに渡すことはできず、文字列のみを渡すことができるようです。問題のコメント オブジェクトの ID を渡し、それをタグに取り込むと思います。

私はこれについて間違っていました。次のように渡されたオブジェクトにアクセスする必要があります。

self.comment.resolve(context).user 

対。

self.comment.user
4

3 に答える 3

3

わかりました、これが私がやった方法です...

タグは、テンプレートで次のように使用されます。

   {% load access_tags %}
   {% if_authorized comment.user object.user user %}
      <a href="{% url delete_comment comment.id %}">Delete</a>
   {% endif_authorized %}

テンプレート タグ ファイルは「access_tag.py」と呼ばれ、アプリの「templatetags」ディレクトリにあります。これは「access_tag.py」の内容です:

from django.template import Node, NodeList, TemplateSyntaxError
from django.template import Library, Variable, VariableDoesNotExist

register = Library()

def do_if_authorized(parser, token):
    """
    Outputs the contents of the block if the 'comment owner' or the 
    'page owner' is also the 'authenticated user'. As well, you can use
    an {% else %} tag to show text if the match fails.

    Takes three parameters:
      1) the comment owner
      2) the page owner
      3) the current authenticated user
    """
    bits = token.contents.split()
    if len(bits) != 4:
        raise TemplateSyntaxError("%s tag takes three arguments: \
                                   1) the comment owner \
                                   2) the page owner \
                                   3) the current authenticated user" % bits[0])
    nodelist_true = parser.parse(('else', 'endif_authorized'))
    token = parser.next_token()

    if token.contents == 'else':
        nodelist_false = parser.parse(('endif_authorized',))
        parser.delete_first_token()
    else:
        nodelist_false = NodeList()
    return IfAuthorizedNode(bits[1], bits[2], bits[3], nodelist_true, nodelist_false)

class IfAuthorizedNode(Node):
    def __init__(self, comment_owner, page_owner, authenticated_user, nodelist_true, nodelist_false):
        self.nodelist_true = nodelist_true
        self.nodelist_false = nodelist_false
        self.comment_owner = Variable(comment_owner)
        self.page_owner = Variable(page_owner)
        self.authenticated_user = Variable(authenticated_user)

    def render(self, context):
        try:
            comment_owner = self.comment_owner.resolve(context)
            page_owner = self.page_owner.resolve(context)
            authenticated_user = self.authenticated_user.resolve(context)
        except VariableDoesNotExist:
            return ''

        if comment_owner == authenticated_user or page_owner == authenticated_user:
            return self.nodelist_true.render(context)
        else:
            return self.nodelist_false.render(context)

register.tag('if_authorized', do_if_authorized)

終わり。最終的には、組み込みの {% if %} タグを使用してこの比較を行うのは非常に簡単でしたが、オブジェクトごとに他の承認を行う必要があるため、これらのカスタムを構築し続けます。 「アクセスタグ」。さらに、テンプレート コードはとてもきれいに見えます :)

于 2010-09-23T04:08:16.083 に答える
2

これはどうですか...コンテキストに変数を書き込むカスタムタグを作成し、次を使用してその変数をテストします{% if %}

次のようになります。

{% check_access comment %}
{% if has_access %}
    <a href="{% url delete_comment comment.id %}">Delete</a>
{% endif %}

もちろん、「check_access」タグはコンテキストに「has_access」を書き込みます。

幸運を

于 2010-09-22T23:13:54.017 に答える
2

あなたがやりたいことを実現することを目的としたプロジェクトがすでに存在します。

django-authority を使用すると、テンプレートの権限をきめ細かく制御できます。

Django 1.2 には、テンプレートにもユーザー権限が含まれています。

于 2010-09-22T22:16:52.517 に答える