1

私は非常に奇妙な状況で立ち往生しています。templatetag / somefile.pyには、ajax_print_widgetrender_widgetという名前の2つのメソッドが定義されています。

 def ajax_print_widget(request, template, context1 ):
 if request.is_ajax():
     q = request.GET.get( 'q' )
     if q is not None:
         data = {
             'results': context1,
         }
         import pdb; pdb.set_trace()
         return render_to_response( template, data, 
                                    context_instance = RequestContext( request ) )

 @register.simple_tag
 def render_widget(widget_settings):
     widget = widget_settings.get_widget()
     template_name = widget.template_name
     context = widget.context(widget=widget_settings)
     t =  get_template("widgets/%s" % template_name)
     return ajax_print_widget(t,context)

私の主な動機は、Ajaxを使用してデータを渡し(ajax_print_widgetメソッドをチェックインしているため)、それをテンプレートにレンダリングすることです。残りは、指定されたテンプレート名でjqueryによって処理されます。これを実行するために、私は次の手順を実行しています。

    1. render_widgetメソッドで、Ajaxの目的に必要な2つの変数、つまりテンプレート名('t')と必要なデータ('context')を取得しています。
    2.次に、render_widgetから戻るときに呼び出すことにより、これら2つの変数をパラメーターとしてajax_print_widgetメソッドに渡す必要があります(コードを参照)。
    3.ご覧のとおり、追加のパラメーター、つまりajax _...メソッドの「request」が必要です( `request.is.ajax():`をチェックするために必要です)。しかし、私はこのパラメーターをajax..methodに送信する方法を見つけることができません

私はこれを書いてみました:

return ajax_print_widget(request, t, context)

しかし、エラーが表示されています。つまり、リクエストはグローバル変数ではありません(これは明らかです)。コードの残りの部分を上に貼り付けたままにしておくと、別のエラーが表示されます。つまり、ajax_printは3つの引数を取り、2つが与えられます(右)。この問題を解決するためのヒントが得られず、リクエストを渡さないとうまくいきません。

それとは別に、テンプレートタグについて疑問があります。このrender_widgetメソッドを検索しても、呼び出されたファイルは見つかりませんでした。テンプレートタグの意味も教えてください。テンプレートタグで定義されたメソッドはどこかから呼び出されますか、それともテンプレートタグでこれを書くのはなぜですか?

4

1 に答える 1

7

設定で有効django.core.context_processors.requestにしTEMPLATE_CONTEXT_PROCESSORS(デフォルトではそこにはありません)、タグを に変更するとtakes_context=True、テンプレート タグ内でリクエストを取得できます。https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#simple-tags

@register.simple_tag(takes_context=True)
def render_widget(context, widget_settings):
    request = context.get('request')
    # Rest of the tag goes here

これには、テンプレートをRequestContext.

于 2012-05-23T19:06:16.620 に答える