在Django中处理包含模板标签的请求

7
我是新手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需要1个参数
请问我应该从模板传递什么参数?
1个回答

13

在注册标签时,您需要添加takes_context=True才能使django将上下文对象传递给函数:

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

默认情况下,context总是作为第一个参数传递!

更多详细信息,请参阅Django关于包含标签的文档。

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


我遇到了这个问题!!我在网页的各个地方都使用了一个模板标签,因为它包含了登录表单。登录后,我尝试通过 request.POST 传递参数来修改模板标签中的某些内容,但是当登录模板标签重新加载时,request.method 变成了 GET!!! 所以我无法找到该参数。请问我该如何找到该参数? - juankysmith
方法仍然是 GET,因为登录视图很可能在表单发送后执行重定向,所以您无法在那里访问请求数据... - Bernhard Vallant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接