1

私はすでにJinja2のが統合されているようので、私はそれらを拡張するために、私のJinja2のbase.htmlファイルを使用することはできません、私は内蔵のログイン/ログアウトのためのビューのデフォルトは、Djangoのテンプレートを期待する見ることができるようにジャンゴが提供する認証および承認システムを使用してしようとしていますエンジン。Django認証をJinja2テンプレートと正しく統合する方法は?

私は「base.html」を複製し、Djangoのテンプレートに構文を変更することで、この問題を解決することができましたが、このアプローチは異なるテンプレート言語で2つの同じファイルに依存しているために私を強制します。

しかし、私は別の問題があります.Geneja2テンプレートcontextuserオブジェクトにアクセスすることはできません。でも、これはDjangoテンプレートで行うことができます。

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 %} 

私の質問があるが、どのように私はこの問題を回避行くことができますか?私はちょうどDjangoのテンプレートを元に戻すべきですか?これはますます乱雑になるからです。

答えて

2

あなたはDjangoテンプレート言語を使用すると認証コンテキストプロセッサが有効になっているので、あなたが{{ 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!もう1つの質問がありました。組み込みのdjango-registrationはlogin.html/logged_out.htmlなどのテンプレートを使用しています。これを私のjinja base.htmlで拡張することは可能でしょうか、別のdjangoテンプレートベース.html? –

+1

DjangoテンプレートをJinjaテンプレートで拡張することはできません。私はJinjaとDjangoのための基本テンプレートを持たないようにしようと思います、それは不要な複製のように思えます。 Jinjaテンプレートを使って 'registration /'テンプレートをオーバーライドしようとすると、Djangoのテンプレートを使うDjangoの管理者によっても使用されるので、問題が生じるかもしれません。おそらく、 'django-registration'とJinja2テンプレートを指すようにビルドされた認証ビューをカスタマイズすることができます。 – Alasdair

1

Alasdairの答えは最高です!だから、この補遺考えてみましょう。あなたはJinja2のにDTLテンプレートの多くを変換している、と彼らはすべて共通のベースから拡張する場合、ベースファイル内のようなものを置くことを検討:

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

次にあなたができるようになります以前のユーザー変数を問題なく使用することができます。

関連する問題