2011-04-30 8 views
0

CSV 파일에서 전자 메일과 해당 도메인을 표시하는 기본 템플릿을 만들려고합니다.Django의 변수

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

그리고 내 views.py 파일은 다음과 같습니다 :

내 emails.html 파일입니다

이 포함 된 '이메일'변수를 참조하는 올바른 방법은 무엇입니까
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}) 

html 파일에?

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

이를 표현하는 views.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> 

당신은 만들 것이다 :

+0

파일을 읽은 후에 f.close()를 수행하면 파일이 닫히지 않습니다. 파일을 닫는 가장 좋은 방법은 "with open ('/ file')을 f :"로 사용하는 것입니다. –

+0

f.close()는 email_list 행 뒤에 있어야합니까? – David542

+0

예. 대신 with 문을 사용합니다. http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects –

답변

2

은 사용자 정의 필터 as described here

예, :

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] 

사용 (당신이라고 email_tags.py을 사용하고있는 templatetags 모듈을 가정)를 작성 응용 프로그램에 templatetags 디렉토리가 있어야합니다 (모듈이되도록 __init__.py 파일을 추가해야합니다).

이것은 과도한 것처럼 보일 수 있지만 장고 템플릿에 전원을 추가하는 매우 유용한 방법입니다.

+0

사용자 정의 필터는 어디에 저장합니까?를 참조하십시오. – David542

+0

app 디렉토리에서 공백'__init __. py'와'email_tags.py' 파일에 위의 코드를 사용하여'templatetags' 디렉토리를 만듭니다. 앱이 INSTALLED_APPS 설정에 있는지 확인하십시오. –

+0

감사합니다. 또한 django.template.defaultfilters에서 import stringfilter도 emails_tags.py 파일에 포함되어야합니다. – David542

0

또한 당신은 템플릿 태그를 좋아하지 않는 경우보기에서 구문 분석 도메인 (I 템플릿 태그를 좋아하지 않는다) 템플릿에서 다음

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> 
+0

템플릿 태그는 이처럼 간단한 작업을하는 것처럼 보일 수 있지만보기 코드와 템플릿 코드는 매우 깨끗하게 유지됩니다. –

+0

그들은 그렇지만 프로젝트 구조에 복잡성을 추가합니다. 따라서 단순한 프로젝트 또는 간단한보기와의 절충점입니다. 템플릿은 다소 씻어내는 것입니다. – Ted

+0

적당한 크기의 프로젝트는 결국 사용자 정의 템플릿 태그/필터의 이점을 얻을 수 있습니다. 나중에 비즈니스 로직을 깨끗하게 유지할 수 있고, 다음에 필요할 때 templatetags 구조가있을 것이므로 나중에 사용하는 것이 좋습니다. –