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

Posted

技术标签:

【中文标题】处理 django 包含模板标签中的请求【英文标题】:Handling request in django inclusion template tag 【发布时间】:2011-10-06 11:33:40 【问题描述】:

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

我创建了以下包含标签:

#upload_files.py @register.inclusion_tag('upload_form.html') def 上传处理程序(上下文): 请求 = 上下文 ['请求'] view_url = reverse('upload.views.upload_handler') 如果 request.method == 'POST': 表单 = UploadForm(request.POST, request.FILES) 如果 form.is_valid(): form.save() 返回 HttpResponseRedirect(view_url) upload_url, upload_data = prepare_upload(request, view_url) 表单 = UploadForm() upload_model_list = UploadModel.objects.all().order_by('-pub_date')

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

#mypage.html % 扩展 'base.html' % % 加载上传文件 % % 上传处理程序 %

我收到以下错误:

upload_handler 需要 1 个参数

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

【问题讨论】:

【参考方案1】:

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

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

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

有关更多详细信息,请参阅 django 在inclusion tags 上的文档。

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

【讨论】:

我遇到了这个问题!!我在网页上的任何地方都使用模板标签,因为它包含登录表单。登录后,我尝试传递一个参数来修改模板标签中的某些内容,(通过request.POST)但是当登录模板标签再次重新加载时,request.method = GET!!!所以我找不到这个参数。我怎样才能找到那个参数? 那么该方法将再次成为GET,因为登录视图很可能在发送表单后进行重定向,因此您无法访问那里的请求数据...

以上是关于处理 django 包含模板标签中的请求的主要内容,如果未能解决你的问题,请参考以下文章

获取高级自定义模板标记中的请求上下文

在 Django 模板标签中传递请求

如何在模板标签中获取当前用户?

Django - 环境搭建url视图模板标签过滤器

Django之模板层

Django:在 AJAX 请求后加载模板