模板过滤器+如果标签

时间:2011-05-07 20:02:07

标签: django

我已应用模板过滤器,该过滤器从电子邮件地址中提取域名。在模板文件中,我有这段代码:

{% 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()功能,这样我可以轻松更新它?然后我将如何引用模板中的函数(如果与当前不同)?谢谢。

2 个答案:

答案 0 :(得分:13)

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

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

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

要跟进Ben James的评论,如果您在视图中设置了specified_extensions列表,则可以在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()

答案 1 :(得分:2)

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

@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