Django 简单标签在 if 条件下不起作用 [英] Django simple tag doesn't work in if condition

查看:40
本文介绍了Django 简单标签在 if 条件下不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过使用审核工具添加块来自定义视频对象的 django-admin 更改表单.

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

models.py:

class Video(models.Model):元类:db_table = '视频'草稿 = 1适度 = 2已发表 = 3拒绝 = 4HOSTING_UPLOADING = 5可疑 = 6PUBLICATION_STATUSES = ((草案,'草案'),(适度,'适度'),(已发布,已发布"),(HOSTING_UPLOADING, '托管上传'),(拒绝,'拒绝'),(可疑,'可疑'))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(选择=PUBLICATION_STATUSES,默认=MODERATION)

templatetags video_publication_statuses.py:

from api.models 导入视频从 Django 导入模板注册 = 模板.图书馆()@register.simple_tag定义节制(状态):返回状态 == Video.MODERATION@register.simple_tagdef 可疑(状态):返回状态 == Video.SUSPICIOUS@register.simple_tagdef 已发布(状态):返回状态 == Video.PUBLISHED@register.simple_tag定义托管_上传(状态):返回状态 == Video.HOSTING_UPLOADING@register.simple_tagdef 拒绝(状态):返回状态 == Video.REJECTED

change_form.html:

{% 扩展 "admin/change_form.html" %}{% 加载 video_publication_statuses %}{% 可疑的 original.publication_status 作为可疑的_status %}{% moderation original.publication_status as moderation_status %}{% hosts_uploading original.publication_status as hosts_uploading_status %}{% 已发布 original.publication_status 为已发布状态 %}{% 拒绝 original.publication_status as denied_status %}{% 阻止 after_related_objects %}{% if original.pk %}{% for fieldset in adminform %}{% if fieldset.name == 'Moderation' %}{% 包含 "admin/includes/fieldset.html" %}{% 万一 %}{% 结束为 %}<div class="submit-row">{% 如果被拒绝_状态或适度_状态或可疑_状态 %}<input type="submit" value="Publish" name="publish" >{% 万一 %}{% 如果已发布_状态 %}<input type="submit" value="Reject" name="reject" >{% 万一 %}

{% 万一 %}{% 结束块 %}

当我使用显式值而不是标签时,它会起作用:

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

请帮我理解标签有什么问题?

解决方案

我相信这是因为模板标签传递字符串并且您正在根据整数检查字符串,例如返回"3" == 3

不过,从广义上讲,您在模板中放置了很多逻辑,我通常会避免这种情况.模板标签是为呈现逻辑"保留的,我认为这意味着改变呈现方式",而不是改变所查看的内容.该逻辑属于视图或模型本身.

将此逻辑放在您的模型上应该很容易.

class Original(...):def拒绝(自我):返回 self.status == Video.rejected

I want to customize django-admin's change form for video objects by adding block with moderation tools.

When I use custom simpletags in if condition - it doesn't work.

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

When I use explicit values instead of tags it works:

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

Please help me understand what is wrong with tags?

解决方案

I believe this is happening because template tags pass strings and you're checking a string against an integer e.g. return "3" == 3

Broadly speaking though, you're putting a lot of logic in a template and I typically avoid that situation. Template tags are reserved for "presentation logic" and I take that to mean "changing the way something is presented", not changing what is viewed. That logic belongs in a view or the model itself.

It should be easy enough to put this logic on your model.

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

这篇关于Django 简单标签在 if 条件下不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆