【问题标题】:How to solve the did not return httpresonse error with django?如何解决django没有返回httpresponse错误?
【发布时间】:2018-09-05 15:26:20
【问题描述】:

我在注册 django 时遇到问题,这是我的意见代码:

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form = RegistrationForm()

        args = {'form': form}
        return render(request, 'users/reg_form.html', args)

,但我总是得到:

ValueError at /user/register/ 视图 Users.views.register 没有 返回一个 HttpResponse 对象。它返回 None 。要求 方法:POST 请求地址:http://127.0.0.1:3001/user/register/Django 版本:2.0.2 异常类型:ValueError 异常值:视图 Users.views.register 没有返回 HttpResponse 对象。它回来了 没有。例外 位置:/home/iah/.local/lib/python3.5/site-packages/django/core/handlers/base.py 在 _get_response,第 139 行

【问题讨论】:

    标签: python django django-forms django-views


    【解决方案1】:

    检查你的代码并问问你自己如果你有一个 POST 请求并且表单没有验证会发生什么 - 你会发现在这种情况下你没有明确的返回路径,所以函数隐式返回 None

    解决方法非常简单:将函数的最后两行取消缩进,因此当表单未验证时,您也可以返回呈现的模板:

    def register(request):
        if request.method == 'POST':
            form = RegistrationForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('/')
    
        else:
            form = RegistrationForm()
    
        # MAKE SURE WE ALWAYS RETURN A RESPONSE:
        # we end up here when it's a GET request 
        # AND when it's a POST request and the form
        # did not validate   
        args = {'form': form}
        return render(request, 'users/reg_form.html', args)
    

    【讨论】:

    • +1,这是最好的方法。当表单无效时,此答案将重新显示带有错误的表单 - 如果您在 else 块中返回 redirect,那么您将丢失错误。此外,很容易看出这个视图总是返回响应,而不必查看每个 if/else 分支。
    • 谢谢布鲁诺。再次重定向到同一个表单时,我有办法返回错误消息“输入有效数据”吗?
    • 我确实在 args 中添加了一个名为 errors 的字段,并将其与 args 一起传递给 html,但它会出现在对注册表单的每个请求中。只有在表格错误的情况下我才需要这样做。
    • @Hathout 您不需要将 arg 添加到模板上下文中。您已经在模板上下文中拥有该表单,因此您可以执行{% if form.errors %}Please fix the errors below{% endif %} 之类的操作。
    • @Hathout 如果您的表单在模板中正确呈现,它应该已经显示错误消息(字段和非字段错误)。如果没有,那么您将不得不修复您的模板代码(这已记录在案,并且有相当多的外部资源 - 博客文章、SO 问题等 - 关于该主题)。 wrt/ 添加通用错误消息,参见 Alasdair 的评论。
    【解决方案2】:

    您必须从内部 else 块返回响应:

    def register(request):
        if request.method == 'POST':
            form = RegistrationForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('/')
            else:
                # here 
        ...
    

    【讨论】:

    • 我在这里使用 return 和 render 作为答案:stackoverflow.com/questions/26258905/…,但没有任何改变
    • 但是,如果您的请求方法是“POST”但表单无效,则您不会返回任何内容。使用调试器并设置断点来跟踪您的代码
    • 我在新的else中重定向到/,但发生同样的错误
    • 您确定代码已重新加载吗?也请发布更新的代码
    【解决方案3】:

    如果表单无效并且您的form.is_valid() 失败,请确保您返回一些内容。

    例子:

    def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            return redirect('/') # or render(...)/whatever you need to redirect to
    else:
        form = RegistrationForm()
    
        args = {'form': form}
        return render(request, 'users/reg_form.html', args)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      您缺少 else 代码。您的 if 语句说:如果表格有效,请保存表格。但是如果表单无效怎么办,如果用户名全是特殊字符(例如:!@#$%%%^^)或者用户名只有 1 个字符长怎么办,例如:(用户名:A)。或者如果密码只有 3 个字符长(例如:pas)怎么办?在所有这些情况下,用户都应该取回空白表单。您还应该考虑使用基于类的视图进行注册此链接将help

      def register(request):
          if request.method == 'POST':
              form = RegistrationForm(request.POST)
              **if form.is_valid():** 
       # What if the form is not valid you haven't accounted for that 
                  form.save()
                  return redirect('/')
          else:       
       # Adding a else solves this problem. The user gets a blank form back                
              form = RegistrationForm()
              args = {'form': form}
              return render(request, 'users/reg_form.html', args)**
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 2013-09-17
        • 1970-01-01
        相关资源
        最近更新 更多