我已应用模板过滤器,该过滤器从电子邮件地址中提取域名。在模板文件中,我有这段代码:
{% 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()
功能,这样我可以轻松更新它?然后我将如何引用模板中的函数(如果与当前不同)?谢谢。
答案 0 :(得分:13)
您可以使用with
template tag将email.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