如何在django中调用模板标签中的方法时传递“request”参数

时间:2012-05-23 18:53:40

标签: django django-views django-templates django-ajax-selects

我陷入了一种非常奇怪的境地。在templatetag / somefile.py中定义了一个名为: ajax_print_widget render_widget

的方法。
 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目的的变量,即模板名称('t')和所需数据('context')
    2。现在我需要通过在render_widget返回时调用它来将这两个变量作为参数传递给ajax_print_widget方法(参见代码)
    3。如你所见,我需要一个额外的参数,即ajax _...方法中的'request'(检查`request.is.ajax():`时需要)。但我无法找到任何方法将此参数发送到ajax..method

我试着写这个:

return ajax_print_widget(request, t, context)

但它显示错误,即请求不是全局变量(很明显) 如果我把剩下的代码留在上面,那么它会显示另一个错误,即ajax_print需要3个参数,2个给出(右) 现在我没有得到任何解决这个问题的提示,如果没有通过请求就无法解决这个问题。

除此之外我对模板标签有疑问。我甚至搜索这个render_widget方法,我没有在任何调用它的文件中找到它。您还能告诉我模板标签的重要性吗?模板标签中定义的方法是从某个地方调用的,还是为什么我们在模板标签中写这个?

1 个答案:

答案 0 :(得分:5)

如果您在TEMPLATE_CONTEXT_PROCESSORS设置中启用了django.core.context_processors.request(默认情况下不在此处)并将您的代码更改为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呈现模板。