首页 > 解决方案 > 如何修复不返回 HttpResponse 对象的 Django 视图?(CS50 项目一)

问题描述

提交表单时收到以下错误。

ValueError at /edit_entry/hi/
The view encyclopedia.views.edit_entry didn't return an HttpResponse object. It returned None instead.

这是触发错误的views.py。

def edit_entry(request, title):
   if request.method == "POST":
       form = NewEditEntryForm(request.POST)
       if form.is_valid():
           title = form.cleaned_data["title"]
           content = form.cleaned_data["content"]
           util.save_entry(title, content)
           return HttpResponseRedirect("/wiki/" + title)
   else:
       form = NewEditEntryForm()
       return render(request, "encyclopedia/edit_entry.html",{
       "form": NewEditEntryForm(),
       "title": title,
       "content": util.get_entry(title)
       })

有什么问题,我该如何解决?

(我还需要帮助使用现有数据预填充表单。我尝试使用初始,但没有奏效。用现有数据预填充表单的最佳方法是什么?)

util.save_entry

def save_entry(title, content):
    """
    Saves an encyclopedia entry, given its title and Markdown
    content. If an existing entry with the same title already exists,
    it is replaced.
    """
    filename = f"entries/{title}.md"
    if default_storage.exists(filename):
        default_storage.delete(filename)
    default_storage.save(filename, ContentFile(content))

标签: pythondjangodjango-viewsdjango-formscs50

解决方案


对不起,我以为你有模型。

# on util.py

def get_entry_content(title):
    filename = f"entries/{title}.md"
    return default_storage.open(filename).read()

# on views.py
def edit_entry(request, title):
   if request.method == "POST":
       form = NewEditEntryForm(request.POST)
       if form.is_valid():
           title = form.cleaned_data["title"]
           content = form.cleaned_data["content"]
           util.save_entry(title, content)
           return HttpResponseRedirect("/wiki/" + instance.title)
   else:
       content = util.get_entry_content(title)
       initial_dict = {
           "title" : title,
           "content" : content,
       }
       form = NewEditEntryForm(initial=initial_dict)
   return render(request, "encyclopedia/edit_entry.html", {
       "form": form,
   })

好吧,我认为如果这不是您想要的,我会save_entry在控制台中测试该功能,创建和更新以查看它是否有效。


推荐阅读