Шаблонный фильтр + если тег - PullRequest
4 голосов
/ 08 мая 2011

Я применил шаблонный фильтр, который извлекает домен из адреса электронной почты.В файле шаблона у меня есть этот код:

{% 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 ]

13 голосов
/ 08 мая 2011

Вы можете использовать тег шаблона with , чтобы назначить 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.

Чтобы прокомментировать комментарий Бена Джеймса, если вы задали список указанных_экстензий в представлении, вы можете использовать оператор in if оператор.

В представлении:

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()
2 голосов
/ 08 мая 2011

Чтобы отделить логику (от того, что делает «действительный» домен) от вашего шаблона, вы можете написать функцию Python valid_domain(domain) (возвращающую логическое значение) и использовать ее в фильтре пользовательских шаблонов :

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...