1

我陷入了一個非常奇怪的境地。有在templatetag/somefile.py定義與名爲兩個方法:ajax_print_widgetrender_widget如何在調用django中的模板標籤中的方法時傳遞「request」參數

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」)和所需要的數據(「語境」)
    2.現在我需要通過這兩個變量作爲參數通過從render_widget返回時調用它ajax_print_widget方法(見代碼)
    3.正如你看到的,我需要一個額外的參數,即'請求'在ajax _...方法(需要檢查`request.is.ajax():`)。但我無法找到任何方式來發送這個參數來ajax..method

我通過寫作嘗試這樣做:

return ajax_print_widget(request, t, context) 

但它顯示一個錯誤,即請求不是一個全局變量(這是顯而易見的) ,如果我留下其餘的代碼,因爲我粘貼它上面然後它顯示另一個錯誤,即ajax_print需要3個參數和2給出(右) 現在我沒有得到任何提示來解決這個問題,請求它不能爲我工作。

除此之外,我對模板標籤有疑問。我甚至搜索這個render_widget方法,並且我沒有在它被調用的任何文件中找到。你還請告訴我模板標籤的重要性。模板標籤中定義的方法是從某處調用的,或者爲什麼我們在模板標籤中寫入該標籤?

回答

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呈現。

+0

Thenx用於回覆@Mark。我檢查了TEMPLATE_CONTEXT ...,並且它已經存在,並且它已經存在django.core.context_processors.request。然後我改變裝飾器,當你告訴我什麼時候它運行它顯示**任何標籤函數裝飾與takes_context = True必須有第一個參數'上下文**這個錯誤。請幫助我,我是Django的新手:) –

+0

請按照錯誤消息和我的示例代碼。更改標籤的第一個參數以獲取上下文。 –

+0

對不起@Mark我沒有得到這個。我應該在哪裏做出改變? –

相關問題