1

두 개의 다른 확장 템플릿간에 전환하기 위해 템플릿에서 "extends variable"을 사용할 수 있음을 알고 있습니다. 예 :django는 서로 다른 기본 템플릿을 확장합니다

views: 
    if something: 
     base = 'base1.html' 
    else: 
     base = 'base2.html' 
    return render_to_response ('template.html', {'base':base}) 

    template.html: 
    {% extends base %} 

정상적으로 작동합니다. 그러나, 내 문제는 내가 등록 및 로그인 프로세스를 처리하기 위해 내 자신의보기를 작성할 필요가없는 장고 등록을 사용하고 있다는 것입니다. 그것은 또한 변수를 템플릿에 전달할 수 없다는 것을 의미합니다. 내 프로젝트 디렉토리 아래에 등록 템플릿이 있지만.

불행하게도 (login.html 등), 장고 템플릿에서이 작업을 수행 할 수 없습니다

{% if something %} 
    {% extends 'base1.html' %} 
    {% else %} 
    {% extends 'base2.html' %} 
    {% endif %} 

나는 '변수베이스'는 인증-로그인까지 전달 될 수 있다는 사실을 알고있는 유일한 방법입니다 로그인, 로그 아웃 등과 같은 내 자신의 의견을 작성합니다. 이것은 DRY 모델에 맞지 않는 것처럼 보이고 앞으로는 오류가 발생하기 쉽습니다.

내가 수행 할 수있는 또 다른 방법이 있습니까? 또는 문제를 해결할 수있는 포인터가 있습니까?

감사합니다. 아마

-P

답변

4

정직하게 말하면 이것은 코드 냄새처럼 보입니다. 장고 등록을 몇 번 사용해 보았습니다. 꽤 큰 사이트에서 작업했기 때문에 실행 중에 만 알려진 다른 템플릿에서 템플릿을 확장 할 필요가 없었습니다. 시각.

어쨌든 타사 모듈에서 렌더링 한 템플릿에 맞춤 변수를 전달하려는 경우 해당 모듈을 해킹하지 않으려면 예를 들어를 사용해야합니다. 맞춤 template context processor. 또한 django 등록을 사용하면 extra_context이 뷰에 전달 될 수 있습니다. 아마도 충분할 수 있습니다. 원숭이 패치를 시도 할 수도 있습니다. 또는 템플릿 폴더 나 템플릿 로더를 조작하여 필요한 것을 얻을 수도 있습니다.

하지만이 모든 것들은 IMHO 해킹이며 일반적인보기가 아닌 한 한보기에 다른 템플릿을 사용해서는 안됩니다.

+1

Tomasz, 코딩 문제가 더 낫습니다. 질문을 게시 한 후, 나는 조금 더 파고 들었다. 기본 템플릿을 전환해야하는 이유는 전체 사이트 및 모바일 사이트의 두 가지 버전이 있기 때문입니다. 1/2 사이트 이상이 모바일 사이트에 절대 연결되지 않기 때문에 미들웨어를 사용하여보기에 전환을 시작했습니다. 내 문제를 해결하기 위해 내 모바일 GET 요청의 경로를 변경하는 방법을 추가해야한다고 생각합니다. 나는 게으름 때문에 그것을 피하기를 바랬습니다. 게시물을 가져 주셔서 감사합니다! 시간 내 주셔서 감사합니다. – pdxMobile

1

이것은 당신이 찾고있는,하지만 당신은 당신의 base.html에 조건문을 포함 할 수 무엇을하지?

+0

당신은 답글이 아닌 의견에 이런 종류의 물건을 넣어 야합니다. – bx2

+0

평판이 1 개만 나와서 의견을 낼 수 없었습니다. 나는 그것을 명심 할 것이다. 감사. – DTing

1

다른 기본 템플릿을 선택하면 템플릿간에 차이점을 두어서는 안됩니다. 기본 템플릿을 다르게하면 DRY 원칙을 위반하는 것입니다. 일반적인 것들을 템플릿에 넣습니다. registration.html, 당신은을 통해 전화를 다른 템플릿에 차이는 '포함': 당신이 뷰 정의에 사용 하듯이

{%extends base.html%} 

{%if something%} 
    {%include "type1.html"%} 
{%else%} 
    {%include "type2.hmtl"%} 

템플릿 이름이 같은 곳.

3

이 있다면 단 2 (또는 3) 그 '뭔가'부울로 할 수있는 옵션은 다음의 예 아니요 필터를 사용할 수 있습니다 그래서 https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

:

{% extends something|yesno:"base1.html,base2.html" %} 

당신이 만약을 좀 더 자유로운 형식을 원한다면 위에서 언급 한 추가 컨텍스트/사용자 정의 컨텍스트 프로세서 옵션을 사용하여 다음과 같이 해보십시오 :

{% extends selected_template|default:"base2.html" %} 

선택한 템플릿은 원하는 기본 템플릿의 경로 일뿐입니다.