【问题标题】:Template filter + if tag模板过滤器 + if 标记
【发布时间】:2011-05-07 20:02:07
【问题描述】:

我应用了一个模板过滤器,它从电子邮件地址中提取域。在模板文件中我有这个代码:

{% for email in user_list %}

<p> 
{{email.email}} corresponds to this domain: 

<b> {{email.email|domain}} </b>
</p>

{% endfor %}

目前所有域名都加粗。我想要做的是仅将那些具有“有效”电子邮件扩展名的电子邮件地址加粗(例如,仅在域“@gmail.com”中的那些)。如何应用 if 或 ifequal 语句来执行此操作?

例如,这是我希望它具有的逻辑--

{% for email in user_list %}

<p> 
{{email.email}} corresponds to this domain: 

    {% if domain = 'specified extension' %}
    <b> {{email.email|domain}} </b>
    {% else %}
    {{ email.email|domain }}
    {% endif %}

</p>

{% endfor %}

更新:

好的——我通过在models.py 中创建一个自定义模型来完成这项工作,就像这样——

class Table(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    def valid_email(self):
        verified = ['yahoo.com','gmail.com']
        domain = self.email.split('@')[1]
        return domain in verified

并且在模板中index.html --

{% for email in user_list %}

<p> 
{{email.email}} corresponds to this domain: 

    {% if email.valid_email %}
    <b>{{ email.email|domain}}</b>
    {% else %}
    {{ email.email|domain}}
    {% endif %}
</p>

{% endfor %}

这现在很好用,但我担心当我需要更新 models.py 并篡改已验证的电子邮件列表时。哪里有更好的地方来保存这个valid_emails() 函数,以便我可以轻松更新它?然后我将如何引用模板中的函数(如果与当前不同)?谢谢。

【问题讨论】:

  • 不要在模板中硬编码那些有效域!

标签: django


【解决方案1】:

您可以使用with template tagemail.email|domain 分配给domain

<p> 
{{ email.email }} corresponds to this domain: 
  {% with domain=email.email|domain %} 
    {% if domain = 'specified extension' %}
    <b>{{ domain }}</b>
    {% else %}
    {{ domain }}
    {% endif %}
  {% endwith %}
</p>

请注意,我使用了 Django 1.3 with 语法。请参阅 Django 早期版本的文档。

要跟进 Ben James 的评论,如果您在视图中设置了指定扩展名列表,则可以在 if 语句中使用 in operator

在视图中:

specified_extensions = ['gmail.com', 'hotmail.com',]

在模板中:

{% if domain in specified_extensions %}
...

更新:

我认为您已将valid_emails 方法放在正确的位置,它属于模型。如果您希望能够在不重新启动服务器的情况下更新域列表,我建议您将域存储在数据库中。

class VerifiedDomain(models.Model):
    name = models.CharField(max_length=50, help_text="an allowed domain name for emails, e.g 'gmail.com'")

class Table(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    def valid_email(self):
        domain = self.email.split('@')[1]
        return VerifiedDomain.objects.filter(name=domain).exists()

【讨论】:

  • ruby 在这方面要好得多。无论如何,我一直在这种情况下使用过滤器。
  • with: 类似于 javascript 3.1
  • with 命令错误。你必须先分配变量,即{% with domain=email.email|domain %}
  • @suhailvs 谢谢,我现在已经修好了。我很惊讶有人花了 8 年才发表评论说代码错误!
【解决方案2】:

为了使(使“有效”域的逻辑)与您的模板分开,您可以编写一个 Python 函数 valid_domain(domain)(返回一个布尔值)并在 custom template filter 中使用它:

@register.filter
def bold_valid_domains(domain, autoescape=None):
    def esc(text):
        return conditional_escape(text) if autoescape else text
    if valid_domain(domain):
        result = "<b>%s</b>" % (esc(domain),)
    else:
        result = domain
    return mark_safe(result)
bold_valid_domains.needs_autoescape = True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2013-03-16
    • 2020-02-16
    • 2016-09-07
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多