【问题标题】:How to fix a Django view that is not returning an HttpResponse Object? (CS50 Project 1)如何修复不返回 HttpResponse 对象的 Django 视图? (CS50 项目 1)
【发布时间】:2021-08-04 14:31:33
【问题描述】:

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

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))

【问题讨论】:

  • 当表单无效时会发生什么?
  • @Sayse,我希望它再次显示表单供用户填写。我应该使用 form.errors 吗?

标签: python django django-views django-forms cs50


【解决方案1】:

抱歉,我以为你有模特。

# 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 函数,创建并更新它是否有效。

【讨论】:

  • 您的解决方案有效(谢谢!),但我的表单没有保存编辑(应该使用 util.save_entry(title, content) 保存)或将用户重定向到 wiki 页面(使用 return HttpResponseRedirect("/wiki/" + title) 完成)。你知道我应该怎么做才能解决这个问题吗?
  • ups,这是一个编辑,我没有意识到,我会更新我的答案
  • entry = get_object_or_404(Entry, title=title) 中我收到一条错误消息,即name 'Entry' is not defined。网上看告诉我第一个参数应该是django模型,但是我的代码中没有创建django模型。如何解决此错误?
  • 请告诉我你的util.save_entry 实现
  • 我添加了 util.save_entry。
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多