2016-08-17 2 views
-2

views.py 파일에 기본 정보를 가져 오는 함수가 있는데, 사전을 반환하도록하여 각 페이지의 컨텍스트를 업데이트하려고합니다. 그러나 render() 함수의 컨텍스트 사전에 .update()을 사용하면 작동하지 않는 것 같습니다.뷰에서 Django 컨텍스트에 .update() 함수를 사용할 수 없습니까?

여기에 내가 뭘 내용은 다음과 같습니다

def getBaseInfo(): 
    allPages = list(Page.objects.all()) 
    primaryPages = allPages[:5] 
    secondaryPages = allPages[5:] 
    return {'p':primaryPages, 'p2':secondaryPages} 

def index(request): 
    return render(request, 'pages/index.html', {}.update(getBaseInfo())) 

는하지만, 아무것도 내 템플릿에 전송되지 않습니다. 미리 감사드립니다!

편집 : 파이썬 2.7.11을 사용하고

+1

https://docs.python.org/3/library/stdtypes.html?highlight=update#dict.update "반환 '없음'부분에 유의하십시오. 파이썬은 자바 스크립트가 아니며, 업데이트 메소드는 dict을 리턴하지 않으며, 당신이하는 일은 의미가 없다. 'getBaseInfo()'를 컨텍스트로서 단순히 전달하지 않는 이유는 무엇입니까? – Wolph

+0

@Wolph, 나는 .update()가'None'을 반환한다는 것을 몰랐습니다! 고마워. 내 Django 응용 프로그램은 사전 내에 값을 반환하여 사전을 업데이트 할 수 없도록하는 Python 2를 사용하기 때문에 문맥으로'getBaseInfo()'를 전달할 수 없습니다 ('{getBaseInfo()}'는'{ 'p ': [],'p2 ': []}' –

+1

'{getBaseInfo()}'는'{'p ': [],'p2 '가되지 않는 사전입니다. ': []}'하지만 getBaseInfo()는 않습니다. 'getBaseInfo()'는 이미 사전을 반환하므로 변환 할 필요가 없습니다. 바로 컨텍스트로 사용할 수 있습니다 – Wolph

답변

2

첫째, 당신은 기본 사전을 사용하고 그렇게 명시해야한다고 개체를 추가하고자한다면 :

def index(request): 
    context = getBaseInfo() 
    context.update({'otherkey': 'othervalue'}) 
    # or 
    context['otherkey'] = 'othervalue' 
    return(...) 

그러나, 모든이 작업을 수행 할 필요가 없습니다. Django는 이미 공유 된 컨텍스트를 자동으로 제공하는 방법을 제공하며 그 값은 context processor입니다.

은 실제로 당신의 getBaseInfo() 기능은 이미 거의 컨텍스트 프로세서입니다 - 그것은 단지 request 매개 변수를 받아 들일 필요가있다 - 그래서 당신은 당신의 템플릿 설정에서 context_processors 목록에 추가해야합니다. 그러면 모두 템플릿이 자동으로 해당 기능에서 값을 가져옵니다.

+0

컨텍스트 프로세서에 대해 알려 주셔서 감사합니다! 나는 Django를 처음 사용하고 아직도 배우기 때문에 - 이것은 정확히 내가 필요로하는 것처럼 보인다! –

1

당신은 같이해야합니다 :

def index(request): 
    allPages = list(Page.objects.all()) 
    primaryPages = allPages[:5] 
    secondaryPages = allPages[5:] 
    return render(request, 'pages/index.html', {'p':primaryPages, 'p2':secondaryPages}) 

다른 옵션은 getBaseInfo 재사용 및 DRY 목적으로 @property을 만들거나 만들 수 있어야 클래스 기반 템플릿보기를보고 재사용 가능한 코드를 mixin으로 정의합니다. 나는 후자를 선호하지만 그것은 전적으로 개인적인 선택의 문제이다.

관련 문제