1

$.load()を使用する Django テンプレートを作成しようとしています{% if user.is_authenticated %}。残念ながら、AJAX によって生成された HTTP リクエストへの応答である場合にのみuser、オブジェクトがサーバー上でレンダリングされるときにテンプレートで定義されていません。

my_template.html:

{% if user.is_authenticated %}
  <div>This should be printed</div>
{% else %}
  <div>But this is because there is no user object</div>
{% endif %}

my_loader.html:

{% if user.is_authenticated %}
  <div>This works fine because I'm logged in</div>
{% endif %}
<div id="template'></div>
<script>
  $('#template').load('/my_template.html');
</script>

views.py (django-annoying の@render_toデコレータを使用):

@render_to('my_template.html')
def my_template(request):
  return {}

問題は、私が理解しているように、 my_loader.html のレンダリングで利用可能な「コンテキスト」が、 を介してサーバーで利用できないことです.load()。この「コンテキスト」がセッションなのか、Cookie なのか、ヘッダー内の何かなのかはわかりませんが、結果として、サーバーが AJAX によって生成された HTTP リクエストから my_template.html をレンダリングすると、userオブジェクトがありません。ブラウザに有機的にロードすると、正常に動作します。

それが役立つ場合:

  • これは同じドメインにあります。
  • 代わりに .ajax() を使用してみましたxhrFields: { withCredentials: true }
  • .ajax() の代わりに .ajax() を使用してみましたheaders: { 'sessionid': $.cookie('sessionid') }。sessionid Cookie は存在しませんでした (ただし、csrftoken は存在していたので、正しい場所を探していたことがわかります)。

userAJAX 経由で my_template.html のようなページをロードするときに、my_loader.htmlのオブジェクトをサーバーで使用できるようにする方法はありますか?

4

2 に答える 2

1

{% if user.is_authenticated %}Javascript側で評価されることを期待していたと思いますか?まあ、それはこれがどのように機能するかではありません。Javascript は、サーバー側に何があるか、ユーザー テンプレート変数を解析、評価、またはバインドする方法を認識していません。

が機能するためには、返される前にDjango によってレンダリングされる$('#template').load('/my_template.html');ことを確認する必要があります。レンダリングするビューを (Django で) 作成するだけです。セッションについて心配する必要はありません。Ajax リクエストとともに Cookie (セッションを識別する) も送信されるため、Django は適切なセッションを選択して、そこからユーザー オブジェクトをプルできるため、機能するはずです。my_template.htmlmy_template.html

于 2013-09-11T06:57:30.833 に答える
0

私のサンプル コードには実際には何も問題がないので、気分が悪くなります。複雑な実際のコードを抽象的なレベルにまで抽出して皆さんに提示しようとしたときに、問題の根本原因である複雑さをうっかり忘れてしまいました。 .

.load()デフォルトでリクエストでCookieが渡されるというWTKと私の最初の直感は、実際には正しかったことがわかりました(HTTPリクエストを調べて確認します)。

したがって、実際の問題は、実際には、1 つのテンプレートではなく 2 つのネストされたテンプレートがあり、後者は実際にはテンプレートタグであったということです。したがって、実際の構造は次のようになりました。

my_template.html:

Some stuff
{% my_template_tag %}

my_template_tag.html:

{% if user.is_authenticated %}
  <div>This should be printed</div>
{% else %}
  <div>But this is because there is no user object</div>
{% endif %}

tags.py

@register.inclusion_tag('my_template_tag.html')
def my_template_tag():
  return {}

... ここで、views.py と my_loader.html は上記と同じです。my_template_tag()振り返ってみると、 がパラメーターをとらなかったことに気付いたはずです。requestつまり、RequestContext で使用可能にできないということuserです。request基本的に: テンプレート タグは、テンプレートのようにコンテキスト内に暗黙的に を持っていuserませrequest.userん。

後でこれを読む人のために、2 つの解決策があります。

  1. userオブジェクトをパラメーターとして手動で template_tag に渡します。
  2. デフォルトでリクエストを渡すため、可能であればキーワードとともに使用{% include %}します。with

それでも、これをラバーダッキングしてくれたことに感謝します! 皆さんが私に戻って私の最初の仮定に疑問を投げかけるように強制しなければ、本当の問題を理解することはできなかったでしょう!

于 2013-09-11T07:42:13.063 に答える