Переменные в Джанго - PullRequest
       2

Переменные в Джанго

0 голосов
/ 30 апреля 2011

Я пытаюсь создать базовый шаблон, который отображает электронные письма и соответствующие домены из файла CSV.

Мой файл emails.html:

<html>
<head>Emails</head>
<body>
    <ul>
        {% for email in email_list %}
        <li> {{email}} </li>
        <li> {{domain}} </li>
        {% endfor %}
    </ul>
</body>

И мой файл views.py:

def emails(request):
    f = open('/Users/name/Desktop/emails.csv')
    email_list = f.read().split()
    # domain = email.split('@')[1]
    return render_to_response('emails.html', {'email_list':email_list, 'domain':domain})

Как правильно ссылаться на переменную 'email', содержащуюся в html-файле? Например, если бы я выполнял функцию в одном скрипте, я бы получил ее как:

for emails in 'list of emails':
    domain = emails.split('@')[1]
    print emails, domain

Какое правильное выражение использовать в views.py для выражения этого? Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Создайте пользовательский фильтр , как описано здесь

Например:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter(name='domain')
@stringfilter
def domain(value):
    if '@' in value:
        return value.split('@')[1]

Использование (при условии, что используемый вами модуль templatetags называется email_tags.py):

{% load email_tags %}
<html>
<head>Emails</head>
<body>
    <ul>
        {% for email in email_list %}
        <li> {{email}} </li>
        <li> {{email|domain}} </li>
        {% endfor %}
    </ul>
</body>

Вы должны создать каталог templatetags в своем приложении (и обязательно добавьте файл __init__.py, чтобы он был модулем).

Это может показаться излишним, ноэто очень полезный способ увеличить мощность шаблонов Django.

0 голосов
/ 30 апреля 2011

Вы также можете выполнить анализ домена в представлении, если вам не нравятся теги шаблонов (мне не нравятся теги шаблонов)

def emails(request):
  f = open('/Users/name/Desktop/emails.csv')
  email_list = f.read().split()
  email_domain_set = []  # a list of dictionaries
  for email in email_list:
    #guard against data integrity problems (i.e. email doesn't have an @)
    try:
      email_domain_dict = {"email":email, "domain": email.split('@')[1]}
      email_domain_set.append(email_domain_dict)        
    except IndexError:
      pass
      # if we want to see errors, but not fail, could do that like this 
      #email_domain_dict = {"email":email, "domain": "ERROR"}
      #email_domain_set.append(email_domain_dict)        

  return render_to_response('emails.html', {'email_domain_set':email_domain_set})

Тогда в вашем шаблоне

<html>
<head>Emails</head>
<body>
    <ul>
        {% for item in email_domain_set %}
        <li> {{item.email}} </li>
        <li> {{item.domain}} </li>
        {% endfor %}
    </ul>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...