Django简单标记不';如果条件允许,我不能工作

Django简单标记不';如果条件允许,我不能工作,django,django-templates,Django,Django Templates,我想通过添加带有调节工具的块来定制django管理员对视频对象的更改表单 当我在if条件下使用自定义simpletags时,它不起作用 models.py: class Video(models.Model): class Meta: db_table = 'video' DRAFT = 1 MODERATION = 2 PUBLISHED = 3 REJECTED = 4 HOSTING_UPLOADING = 5 S

我想通过添加带有调节工具的块来定制django管理员对视频对象的更改表单

当我在if条件下使用自定义simpletags时,它不起作用

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视频\u出版物\u状态.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
更改\u 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 %}
{%extends“admin/change\u form.html”%}
{%加载视频\发布\状态%}
{%可疑原件。发布状态为可疑状态%}
{%moderation original.publication_status为moderation_status%}
{%hosting\u正在上载原件。发布\u状态为hosting\u正在上载\u状态%}
{%published original.publication\状态为published\状态%}
{%rejected original.PUBLISION_状态为rejected_状态%}
{与\u相关的\u对象之后的%block%}
{%if original.pk%}
{%用于adminform%中的字段集}
{%if fieldset.name=='Moderation%}
{%include“admin/includes/fieldset.html”%}
{%endif%}
{%endfor%}
{如果拒绝\状态或审核\状态或可疑\状态%}
{%endif%}
{%如果已发布\状态%}
{%endif%}
{%endif%}
{%endblock%}
当我使用显式值而不是标记时,它会起作用:

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

请帮助我了解标签有什么问题

我认为这是因为模板标记传递字符串,并且您正在根据整数检查字符串,例如
返回“3”==3

但从广义上讲,您在模板中加入了大量逻辑,我通常避免这种情况。模板标记是为“表示逻辑”保留的,我认为这意味着“更改表示方式”,而不是更改所查看的内容。该逻辑属于视图或模型本身

将这种逻辑应用到模型上应该很容易

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

我认为这是因为模板标记传递字符串,并且您正在检查字符串与整数的对比,例如
返回“3”==3

但从广义上讲,您在模板中加入了大量逻辑,我通常避免这种情况。模板标记是为“表示逻辑”保留的,我认为这意味着“更改表示方式”,而不是更改所查看的内容。该逻辑属于视图或模型本身

将这种逻辑应用到模型上应该很容易

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