2016-09-18 1 views
0

Ich möchte Django-Admins Änderungsformular für Videoobjekte durch Hinzufügen von Block mit Moderationswerkzeuge anpassen.Django einfaches Tag funktioniert nicht, wenn Bedingung

Wenn ich in if-Zustand benutzerdefinierte SimpleTags verwenden - es funktioniert nicht.

models.py:

class Video(models.Model): 

    class Meta: 
     db_table = 'video' 

    DRAFT = 1 
    MODERATION = 2 
    PUBLISHED = 3 
    REJECTED = 4 
    HOSTING_UPLOADING = 5 
    SUSPICIOUS = 6 

    PUBLICATION_STATUSES = (
     (DRAFT, 'draft'), 
     (MODERATION, 'moderation'), 
     (PUBLISHED, 'published'), 
     (HOSTING_UPLOADING, 'hosting uploading'), 
     (REJECTED, 'rejected'), 
     (SUSPICIOUS, 'suspicious') 
    ) 

    video_pk = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=150, blank=True) 
    hosting_id = models.CharField(max_length=20, blank=True) 
    publication_status = models.PositiveSmallIntegerField(choices=PUBLICATION_STATUSES, default=MODERATION) 

templatetags video_publication_statuses.py:

from api.models import Video 
from django import template 

register = template.Library() 

@register.simple_tag 
def moderation(status): 
    return status == Video.MODERATION 


@register.simple_tag 
def suspicious(status): 
    return status == Video.SUSPICIOUS 


@register.simple_tag 
def published(status): 
    return status == Video.PUBLISHED 


@register.simple_tag 
def hosting_uploading(status): 
    return status == Video.HOSTING_UPLOADING 


@register.simple_tag 
def rejected(status): 
    return status == Video.REJECTED 

change_form.html:

{% extends "admin/change_form.html" %} 
{% load video_publication_statuses %} 
{% suspicious original.publication_status as suspicious_status %} 
{% moderation original.publication_status as moderation_status %} 
{% hosting_uploading original.publication_status as hosting_uploading_status %} 
{% published original.publication_status as published_status %} 
{% rejected original.publication_status as rejected_status %} 

{% block after_related_objects %} 
    {% if original.pk %} 
    {% for fieldset in adminform %} 
     {% if fieldset.name == 'Moderation' %} 
     {% include "admin/includes/fieldset.html" %} 
     {% endif %} 
    {% endfor %} 
    <div class="submit-row"> 
     {% if rejected_status or moderation_status or suspicious_status %} 
     <input type="submit" value="Publish" name="publish" > 
     {% endif %} 
     {% if published_status %} 
     <input type="submit" value="Reject" name="reject" > 
     {% endif %} 
    </div> 
    {% endif %} 
{% endblock %} 

Wenn ich explizite Werte anstelle von Tags funktioniert es:

{% if original.publication_status == 3 %} 
    <input type="submit" value="Reject" name="reject" > 
    {% endif %} 

Bitte helfen Sie mir zu verstehen, was mit Tags falsch ist?

Antwort

2

Ich glaube, das passiert, weil Template-Tags Strings übergeben und Sie eine Zeichenkette gegen eine ganze Zahl prüfen, z. return "3" == 3

Grob gesagt, Sie setzen eine Menge Logik in eine Vorlage und ich vermeide normalerweise diese Situation. Template-Tags sind der "Präsentationslogik" vorbehalten und ich meine, dass "die Art und Weise, wie etwas präsentiert wird, geändert wird" und nicht ändert, was betrachtet wird. Diese Logik gehört zu einer Ansicht oder dem Modell selbst.

Es sollte einfach genug sein, diese Logik in Ihr Modell zu integrieren.

class Original(...): 
    def rejected(self): 
    return self.status == Video.rejected  
Verwandte Themen