1

장고가 제공하는 인증 및 권한 부여 시스템을 사용하려고하는데 로그인/로그 아웃 기본 기본보기가 장고 템플릿을 기대할 수 있으므로 내 Jinja2 base.html 파일을 사용하여 확장 할 수 없습니다. 엔진.Django 인증을 Jinja2 템플릿과 올바르게 통합하는 방법은 무엇입니까?

'base.html'을 복제하고 구문을 Django 템플릿으로 변경하여이 문제를 해결할 수 있었지만이 접근 방식을 통해 다른 템플릿 언어로 된 두 개의 동일한 파일에 의존하게되었습니다.

그러나 이제는 다른 문제가 있습니다. Jinja2 템플릿 context에있는 user 개체에 액세스 할 수 없습니다. 장고 템플릿에서 수행 할 수 있습니다.

File "/home/dir/workspace/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 430, in getattr return getattr(obj, attribute) 
UndefinedError: 'user' is undefined 

내 Jinja2 템플릿 : '나는 액세스 할 수 없습니다'라고하여

{% if user.is_authenticated %} 
    <li>User: {{ user.get_username }}</li> 
    <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li> 
{% else %} 
    <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li> 
{% endif %} 

내 질문은, 어떻게 내가이 문제를 해결 갈 수 있나요? 장고 템플릿을 좀 더 지저분 해지기 때문에 장고 템플릿을 되돌려 줘야할까요?

답변

2

장고 템플릿 언어를 사용하는 경우 인증 컨텍스트 프로세서가 활성화되어 있기 때문에 {{ user }}을 사용할 수 있습니다. 그러나 using context processors with Jinja2 is discouraged.

Jinja2 템플릿 컨텍스트에서 request에 액세스 할 수 있으므로 request.user에 액세스 할 수 있습니다. 장고 < 1.10, user.is_authenticated() 당신이 Jinja2 템플릿을 호출해야합니다 있도록하는 방법이다

Supported in Django 1.10 and 1.11, required in Django 2.0+ 
{% if request.user.is_authenticated %} 

참고 :

Required in Django < 1.10, supported in Django 1.10 and 1.11 
{% if request.user.is_authenticated() %} 
+0

감사합니다. 다시 한번 감사드립니다. @Alasdair! 한 가지 더 질문이있어서 내장 된 django-registration은 login.html/logged_out.html 등의 템플릿을 사용합니다. 내 jinja base.html로 확장 할 수 있습니까? 아니면 별도의 장고 템플릿 기반을 사용해야합니까? .html? –

+1

Jinja 템플릿으로 Django 템플릿을 확장하거나 그 반대로 확장 할 수 없습니다. Jinja와 Django에 기본 템플릿을 사용하지 않으려 고 노력할 것입니다. 불필요한 복제와 같은 소리입니다. Jinja 템플릿으로 Django 템플릿을 사용하는 Django 관리자가 사용하기 때문에'registration /'템플릿을 Jinja 템플릿으로 덮어 쓰려고하면 문제가 발생할 수 있습니다. Jinja2 템플릿을 가리 키도록'django-registration'과 내장 된 인증 뷰를 사용자 정의 할 수 있습니다. – Alasdair

1

Alasdair의 대답은 최고입니다! 당신이 Jinja2에 DTL 템플릿을 많이 변환하는 경우, 그들은 모두 같은 기본 파일 뭔가 퍼팅을 고려, 공통의 기지에서 연장 : 그래서이 부록 고려

{% if user is not defined %} 
    {% set user=request.user %} 
{% endif %} 

이 그럼 당신은 할 수 있습니다 이전 사용자 변수를 문제없이 사용할 수 있습니다.