【问题标题】:Handling request in django inclusion template tag处理 django 包含模板标签中的请求
【发布时间】: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 个参数

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

【问题讨论】:

    标签: django templates request templatetags


    【解决方案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,因为登录视图很可能在发送表单后进行重定向,因此您无法访问那里的请求数据...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2018-02-22
    • 2013-02-13
    • 2017-01-05
    相关资源
    最近更新 更多