处理django包含模板标记中的请求

时间:2011-07-15 20:54:29

标签: django templates request templatetags

我是Django的新手,我正在尝试将上传文件表单放入包含标记中。所以我可以在各种模板中使用它。

我创建了以下包含标记:

#upload_files.py

@register.inclusion_tag('upload_form.html')
def upload_handler(context):
    request = context['request']
    view_url = reverse('upload.views.upload_handler')
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
        return HttpResponseRedirect(view_url)

    upload_url, upload_data = prepare_upload(request, view_url)
    form = UploadForm()

    upload_model_list = UploadModel.objects.all().order_by('-pub_date')

我现在希望将其包含在模板中,所以在我的页面上:

#mypage.html
{% extends 'base.html' %}
{% load upload_files %}

{% upload_handler %}

我收到以下错误:

upload_handler takes 1 arguments

我应该从模板中传递什么参数?

1 个答案:

答案 0 :(得分:11)

注册标记时需要添加takes_context=True以使django将上下文对象传递给函数:

@register.inclusion_tag('upload_form.html', takes_context=True)

默认context将始终是第一个参数!

有关详细信息,请参阅django关于inclusion tags的文档。

附注:仔细确定您使用此模板标签的页面,因为视图可能会以某种方式呈现其他表单/处理发布请求,这可能会与您的标记提供的逻辑发生冲突(例如,表单验证将会如果页面可能被来自另一个表单的帖子请求调用,则触发)。你可以,例如。另外,如果页面上有多个表单,请检查某些HTML元素的名称是否在request.POST中!