处理 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 包含模板标签中的请求的主要内容,如果未能解决你的问题,请参考以下文章