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

Ami*_*Pal 1 django django-templates django-views django-ajax-selects

我陷入了一种非常奇怪的境地.在templatestag/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)
Run Code Online (Sandbox Code Playgroud)

我的主要动机是使用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)
Run Code Online (Sandbox Code Playgroud)

但它显示一个错误,即请求不是一个全局变量(很明显),如果我把剩下的代码粘贴在上面然后它显示另一个错误,即ajax_print需要3个参数,2个给出(右)现在我我没有得到任何解决这个问题的提示,如果没有通过请求,它对我不起作用.

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

Mar*_*vin 5

如果您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
Run Code Online (Sandbox Code Playgroud)

请注意,这还需要使用a来呈现模板RequestContext.