2011-01-29 1 views
0

기본 템플릿에 임의의 슬로건을 추가하고 싶습니다. 이 작업을 쉽게 수행 할 수있는 방법은 내 구호가 들어있는 db 테이블을 갖고 무작위로 하나를 가져 와서 템플릿에 전달하는 것입니다.django 템플릿에 포함 된 파일에서 임의의 라인을 가져 오는 최적의 방법

질문은 데이터베이스를 사용하지 않고 어떻게합니까? 기본 템플릿에서 각 줄에 하나씩 구두점이 포함 된 파일을 포함시키고 무작위로 템플릿을 선택하겠습니다. random 필터가 목록에서 임의의 값을 선택한다는 것을 알고 있으므로 어떻게 든 include이라는 슬로건 파일이 필요하지만 목록으로 사용합니다.

+0

데이터베이스를 통해 플랫 파일을 사용하려는 특별한 이유가 있습니까? – KyleWpppd

+0

슬로건은 거의 변하지 않을 것이며 그 중 일부만 있습니다. db 캐싱을 사용하는 경우에도 모든 페이지 머리글에 문장을 넣기 위해 별도의 응용 프로그램을 만들고 유지 관리하는 불필요한 복잡성 (또는 관련없는 기존 응용 프로그램을 더티하게 처리하는 것)처럼 보입니다. 나에게 논리적 인 장소는 내'header.html' 템플릿에'base.html' 템플릿에 포함되어 있어야합니다. – gorus

+0

내 생각에 무작위로 슬로건을 선택하는 기능이 있다면 데이터베이스는 플랫 파일을 사용하는 것보다 훨씬 효율적으로 처리 할 수 ​​있습니다. db에 대한 호출을 캐시 할 수 있지만 귀하의 슬로건에 대한 호출을 할 수 있습니까? – KyleWpppd

답변

0

두 가지 옵션은 내가 참조 :

1) 다음 상황에 삽입) 플랫 파일에서 (즉,이 임의의 견적을로드하는 상황 프로세서를 사용합니다. 예 :

# create your own context-processor file (myutils/context_processors.py) 
def my_random_quote_processor(request): 
    context = {} 

    # generate your string you want in template 
    # .... 
    context['RANDOM_QUOTE'] = my_random_quote 

    return context 


# in settings.py, tell django to include your processor 
TEMPLATE_CONTEXT_PROCESSORS = (
    # ..., 
    'myutils.context_processors.my_random_quote_processor' 
) 


# in your base template, just include the template var 
<p>quote: {{ RANDOM_QUOTE }}</p> 


# make sure in your views, you set the context_instance 
def my_view(request): 
    # ... 
    return render_to_response('myapp/mytemplate.html', c, 
           context_instance=RequestContext(request)) 

2) 내가 템플릿 태그에 투표 것이다 당신이 플랫 파일에서 견적을로드 사용자 정의 템플릿 태그 등 : http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

+0

감사합니다. (1) For : 나는'header.inc'에 슬로건을 포함시키고 모든 페이지에서 다른 컨텍스트를 통과하는 다른 뷰를 가지므로이 경로가 복잡해지기 때문에 추가 변수를 포함하지 않기를 바랬습니다. For (2) : Loarfatron에 대한 내 회신을보십시오 - 이것이 더 좋은 방법이 없다면 갈 길입니다. – gorus

+0

원래 게시물을 업데이트하여 위의 # 1에서 생략하십시오. –

0

을 만듭니다. 무작위 따옴표를 따옴표가있는 텍스트 파일에 별도의 줄에 저장하십시오. 그런 다음 템플릿 태그에서 무작위로 한 행을 읽으십시오. 여기에서 수행하는 방법에 대한 좋은 설명 : http://www.regexprn.com/2008/11/read-random-line-in-large-file-in.html. 아래의 재현 : 템플릿 태그를 인쇄 할 수 있도록

import os,random 

filename="averylargefile" file = 
open(filename,'r') 

#Get the total file size file_size = os.stat(filename)[6] 

while 1: 
    #Seek to a place in the file which is a random distance away 
    #Mod by file size so that it wraps around to the beginning 
    file.seek((file.tell()+random.randint(0,file_size-1))%file_size) 

    #dont use the first readline since it may fall in the middle of a line 
    file.readline() 
    #this will return the next (complete) line from the file 
    line = file.readline() 

    #here is your random line in the file 
    print line 

마지막 라인을 반환합니다.

+0

감사합니다. 파일에서 수동으로 읽는 방법을 사용하면 고맙습니다. 그러나 이것은 정말로 "장고 뒤에서"진행되는 것처럼 보입니다 :) 만약 "장고 방식"을 원한다면 "include"태그를 사용하여 특별한 것을 할 방법이 없다면, 이것이 길 일 거라 생각합니다. – gorus

+0

흠, 더 장고질 방법에 대해 확신하지 못합니다. 호기심 때문에 왜 당신은 DB에서 구호를 지키고 싶습니까? 데이터베이스에 저장하면 관리자를 통해 슬로건을 쉽게 업데이트/추가 할 수 있습니다. – joshcartme

0

슬로건이 아주 작 으면 피클 모듈을 사용할 수 있습니다. 그리고 기본 목록처럼 기본을 조작하십시오. http://docs.python.org/library/pickle.html

는하지만 난 최선의 해결책이

+0

좀 더 구체적으로 알려주시겠습니까?템플릿에서 pickle은 어떻게 사용합니까? 필자는 템플릿에 절인 목록을 전달해야하는 것처럼 보입니다. 정규 목록을 전달하고 '임의'필터를 사용할 수 있습니다. – gorus

관련 문제