【问题标题】:How to pass a "request" parameter at the time of calling a method in template tags in django如何在django的模板标签中调用方法时传递“请求”参数
【发布时间】:2012-05-30 08:46:50
【问题描述】:

我陷入了一个非常奇怪的境地。在 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.is.ajax():` 所必需的)。但我无法找到任何方法将此参数发送到 ajax..method

我通过写作尝试了这个:

return ajax_print_widget(request, t, context)

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

除此之外,我对模板标签有疑问。我什至搜索了这个 render_widget 方法,但在任何文件中都没有找到它被调用的地方。能否请您告诉我模板标签的意义。模板标签中定义的方法是从某个地方调用的,或者为什么我们在模板标签中写这个?

【问题讨论】:

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


    【解决方案1】:

    如果您在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 呈现您的模板。

    【讨论】:

    • 然后回复@Mark。我在 TEMPLATE_CONTEXT... 进行了检查,它 django.core.context_processors.request 已经存在。然后我更改装饰器,当我运行它时显示任何用takes_context = True 装饰的标记函数必须有'context 这个错误的第一个参数。请帮助我,我是 Django 的新手 :)
    • 按照错误消息和我的示例代码。更改标签的第一个参数以获取上下文。
    • 对不起@Mark 我没有得到这个。我应该在哪里进行更改?
    • 函数render_widget现在有两个参数:context和原来的widget_settings
    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 2017-08-11
    • 2011-11-24
    • 1970-01-01
    • 2014-08-06
    • 2011-08-18
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多