1

我陷入了一个非常奇怪的境地。在 templatetag/somefile.py 中定义了两个方法,命名为:ajax_print_widgetrender_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.现在我需要将这两个变量作为参数传递给 ajax_print_widget 方法,方法是在从 render_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.requestTEMPLATE_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 回答