【问题标题】:The view didn't return an HttpResponse object when use redirect()使用 redirect() 时视图未返回 HttpResponse 对象
【发布时间】:2019-05-06 20:25:10
【问题描述】:

我尝试创建模型表单以在 django 中向我的模型添加新记录,但出现此错误:

The view post.views.add_job_resume didn't return an object. It returned None instead.

这是我的文件(请注意,在这个文件中我的代码比我在这里写的要多):

view.py

def add_job_resume(request):
    if request.method=="POST":
        form = AddJobForm(request.POST)
        if form.is_valid():
            job_resume = form.save(commit=False)
            job_resume.user= request.user
            job_resume.save()
            return redirect('view_job_resume')

    else:
        form = AddJobForm()
        return render(request, 'education/job_research_education_records/job_resume/add_job_resume.html', {'form': form})

forms.py

class AddJobForm(ModelForm):
       class Meta:
        model = JobRecord
        fields = [
            'title',
            'explains',
            'post',
            'organization',
            'time_start',
            'time_end',
            'upload_url',
        ]

models.py

class JobRecord(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    title = models.TextField(max_length=250, blank=False)
    explains = models.TextField(max_length=500, blank=True)
    post = models.TextField(max_length=100, blank=False)
    organization = models.TextField(max_length=100, blank=False)
    time_start = models.TextField(max_length=100)
    time_end = models.TextField(max_length=100)
    upload_url = models.FileField(upload_to='job-resume-files/')

    def __str__(self):
        return self.title

add_job_resume.html

<form method="post" >
    {% csrf_token %}
    {{form.as_p }}
    <button type="submit" class="btn btn-info">add</button>
</form>

urls.py

urlpatterns = [
   path('edu/resume/job/', views.view_job_resume, name='view_job_resume'),
   path('edu/resume/job/add', views.add_job_resume, name='add_job_resume')]

我为此错误搜索了很多,但我无法解决!到底是怎么回事?

【问题讨论】:

  • 如果方法是 POST 但表单无效,那么您在视图中什么也不做。

标签: python django django-views modelform


【解决方案1】:

这与redirect(..) 本身无关。您只是忘记了代码路径。该方法可能确实是 POST,但表单无效。所以第一个if 的条件满足,但第二个if 的条件不满足。现在,对于这种情况,您的视图将不会返回任何内容(因此返回 None)。

简单地重新渲染模板是很常见的,但是现在使用无效的表单,这样表单可以显示错误,例如:

def add_job_resume(request):
    if request.method=="POST":
        form = AddJobForm(request.POST)
        if form.is_valid():
            job_resume = form.save(commit=False)
            job_resume.user= request.user
            job_resume.save()
            return redirect('view_job_resume')

    else:
        form = AddJobForm()
    # Not placed under the else
    return render(
        request,
        'education/job_research_education_records/job_resume/add_job_resume.html',
        {'form': form}
    )

请注意,render不是放在else 部分下。确实不管方法是 POST 表单无效,还是方法 not POST,我们渲染页面并响应渲染的页面。

【讨论】:

  • 谢谢!解决了一个错误。:) 我多次填写表格,但没有一个可以导致有效的表格。无效的问题是什么?@willem-van-onsem
  • @mostafarahnama:您可以在渲染之前打印form.errors,这样错误就会打印在服务器的标准输出上。请注意,您应该只在else 的情况下构造一个新表单,否则错误不会在页面呈现时显示。
  • 啊哈。在其他情况下如何构造新表单? @willem-van-onsem
  • @mostafarahnama:在上面的代码片段中已经是这样了。我只是说你不应该在 POST 的情况下创建一个新的,否则错误不会出现,因为从技术上讲,你会呈现一个不同的表单。
【解决方案2】:

重定向不是问题。问题是您的表单无效,如果发生这种情况,视图不会转动任何东西

您应该将最后一行取消缩进一级,以便它捕获这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-11-01
    • 2014-12-03
    相关资源
    最近更新 更多