Frage

Ich versuche, vergeblich, einen einfachen Django Template-Tag zu jeder Show zu erstellen oder zu verstecken ein Link „Löschen“ neben einen eingereichten Kommentar auf meiner Seite.

Auf den Punkt gebracht, möchte ich den Kommentar Objekt dem Template-Tag übergeben, festzustellen, ob der aktuell angemeldete Benutzer berechtigt ist, den Kommentar zu löschen und dann entweder angezeigt oder nicht die Verbindung zeigen.

Die Verwendung in meiner Vorlage wäre etwa so:

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

Sie können sicher sein, dass ich auch in der entsprechenden Ansicht zu prüfen, ob der Benutzer berechtigt ist, den Kommentar zu löschen.

Enthält diese Art von Tag einen bestimmten Namen hat? Es würde mir auf jeden Fall mit meiner Google-Suche helfen, wenn es tut. Vielen Dank für Ihre Hilfe!

UPDATE 1:

Die Art und Weise meine Website funktioniert, sind zwei Personen möglicherweise berechtigt, einen Kommentar zu löschen: 1) Kommentar Schöpfer und 2), die Eigentümer der Post, wo der Kommentar verfasst wurde. Aus diesem Grund muss ich feststellen, pro Kommentar, wenn eine dieser Bedingungen vorliegt.

Ich glaube nicht, dass ich so etwas wie Django integrierten Berechtigungs Sytem verwenden, da es erfordert, dass die Berechtigungen „global pro Objekttyp festgelegt werden, nicht pro spezifischer Objektinstanz“.

In meinem Fall Benutzer „Bob“ kann Berechtigungen um einen Kommentar zu löschen (wenn er es geschrieben hat, oder es ist auf einem Posten, den er geschaffen), aber er kann auch nicht erlaubt werden, um sie zu löschen (wenn er auf einem suchst Kommentar über den Post jemand anderes).

UPDATE 2:

Es scheint, dass Sie keine Objekte mit einem Template-Tag passieren kann, nur Strings: „Auch wenn Sie eine beliebige Anzahl von Argumenten zu einer Vorlage Tag übergeben können mit token.split_contents (), die Argumente sind alle ausgepackt als String Literale.“ Ich denke, ich werde die ID des Kommentars betreffende Objekt übergeben und es in dem Tag ziehen.

Ich war falsch über diese, müssen nur die in übergebene Objekt zugreifen wie:

self.comment.resolve(context).user 

vs.

self.comment.user
War es hilfreich?

Lösung 3

OK, das ist, wie ich es getan hätte ...

Der Tag, wie dies in der Vorlage verwendet wird:

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

Die Template-Tag-Datei wird "access_tag.py" genannt und ist in meiner App "templatetags" Verzeichnis. Dies ist der Inhalt von "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)

Fertig. Am Ende wäre es ziemlich einfach, nur die eingebaute gewesen verwenden {% if%} Tag diesen Vergleich zu tun, aber da ich andere pro-Objekt-Berechtigungen hat, würde zu tun, werde ich auch weiterhin diese Gewohnheit bauen "access_tags". Plus, die Template-Code sieht so viel aufgeräumter:)

Andere Tipps

Es gibt bereits ein Projekt, das Ziel zu tun, was Sie tun mögen.

django-Behörde ermöglicht feinkörnig Kontrolle über Berechtigungen in Vorlagen.

Django 1.2 enthält auch Benutzer Berechtigungen in Vorlagen zu .

Wie sei es diese ... erstellen einen benutzerdefinierten Tag, dass eine Variable im Kontext schreibt, testen Sie dann die Variable mit {% if %}

es so etwas wie dies würde:

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

natürlich der "check_access" Tag würde die "has_access" im Kontext schreiben.

Good Luck

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top