2016-09-18 68 views
0

我想通過添加具有審覈工具的塊來自定義django-admin對視頻對象的更改格式。Django簡單標記在if條件下不起作用

當我在if條件中使用自定義簡單標籤時 - 它不起作用。

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 %} 

當我使用明確的值,而不是標籤工作原理:

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

請幫我理解標籤有什麼問題?

回答

2

我相信這是因爲模板標籤傳遞字符串,而您正在檢查一個字符串, return "3" == 3

儘管如此,你在模板中放了很多邏輯,我通常會避免這種情況。模板標籤保留爲「表示邏輯」,我認爲這意味着「改變呈現方式」,而不是改變觀看的內容。該邏輯屬於視圖或模型本身。

應該很容易將這個邏輯放在你的模型上。

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