Python Django中的变量

Python Django中的变量,python,django,Python,Django,我试图创建一个基本的模板,显示电子邮件和相应的域名从一个CSV文件 我的emails.html文件是: <html> <head>Emails</head> <body> <ul> {% for email in email_list %} <li> {{email}} </li> <li> {{domain}} </li>

我试图创建一个基本的模板,显示电子邮件和相应的域名从一个CSV文件

我的emails.html文件是:

<html>
<head>Emails</head>
<body>
    <ul>
        {% for email in email_list %}
        <li> {{email}} </li>
        <li> {{domain}} </li>
        {% endfor %}
    </ul>
</body>
引用html文件中包含的“email”变量的正确方法是什么?例如,如果我在一个脚本中执行该函数,我会将其设置为:

for emails in 'list of emails':
    domain = emails.split('@')[1]
    print emails, domain
在views.py中使用的正确表达式是什么?谢谢。

创建自定义筛选器

例如:

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\u tags%}
电子邮件
    {电子邮件列表%中的电子邮件为%0}
  • {{email}}
  • {{email | domain}
  • {%endfor%}
您将在应用程序中创建一个
templatetags
目录(并确保添加一个
\uuuu init\uuuuuuuuuuuuy.py
文件,使其成为一个模块)


这似乎有些过分,但这是一种非常有用的方法,可以为Django模板添加功能。

如果您不喜欢模板标记,也可以在视图中进行域解析(我不喜欢模板标记)

然后在模板中

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

电子邮件
    {电子邮件\u域\u集合%中的项目的百分比}
  • {{item.email}
  • {{item.domain}
  • {%endfor%}

您需要在读取文件后执行f.close(),否则您的文件将无法关闭。确保文件关闭的最佳方法是将“open('/file')作为f:”。f.close()应该放在电子邮件列表行之后?是的。不过,我会使用with语句。查看自定义过滤器的保存位置?在你的应用程序目录中,创建一个
templatetags
目录,其中包含一个空白的
\uuuu init\uuuuuuuuuuuuuuuuuuupy
和包含上述代码的
email\u tags.py
文件。确保你的应用程序处于“已安装的应用程序”设置中。谢谢!此外,从django.template.defaultfilters导入stringfilter还需要包含在emails_tags.py文件中。对于这样简单的东西,模板标记似乎需要做很多工作,但它可以使您的视图代码和模板代码非常干净。它们确实如此,但也会增加项目结构的复杂性。因此,这是一种权衡——简单的项目或简单的视图。模板或多或少是一种清洗。任何规模合适的项目最终都将受益于自定义模板标记/过滤器。最好尽早使用它们,因为这样可以保持视图业务逻辑的整洁,并且当您下次需要时,templatetags结构就会出现。我不一定不同意。我可以想到一些情况,我宁愿给我的视图增加复杂性,而且我有过一些不需要自定义模板标记的大型项目。也就是说,我已经告诉大家我对模板标签有偏见
{% load email_tags %}
<html>
<head>Emails</head>
<body>
    <ul>
        {% for email in email_list %}
        <li> {{email}} </li>
        <li> {{email|domain}} </li>
        {% endfor %}
    </ul>
</body>
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>