【问题标题】:Can't get forms in Django to create a POST request (and save to database)无法在 Django 中获取表单来创建 POST 请求(并保存到数据库)
【发布时间】:2015-05-12 11:13:16
【问题描述】:

我想指出这是我的第一个 Django 项目,我没有太多其他编程经验,所以我的错误可能很简单。尽管如此,我还是花了几天时间试图修复它,但没有任何进展。这也是我在这里的第一个问题,所以我希望我做的一切都是正确的。

以下内容来自我的表单页面的模板。表格显示正常。单击“提交”按钮时不会导致页面重新加载,并且肯定没有提交 POST 请求。

<form role="form" action="." method="POST">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons submit='Add new book' reset="Cancel" %}{% endbuttons %}
</form>

models.py:

class Book(models.Model):
    title = models.CharField(max_length=80)
    photo = models.ImageField(upload_to='book_images', blank=True)
    author = models.CharField(max_length=150)
    category = models.CharField(max_length=50)
    product_url = models.CharField(max_length=200)
    num_of_chapters = models.IntegerField()

forms.py:

class AddBookForm(forms.ModelForm):

    class Meta:
         model = Book
         fields = ('title', 'photo', 'author', 'product_url', 'category', 'num_of_chapters')

views.py:

def add_new_book(request):
    if request.method == 'POST':
        form = forms.AddBookForm(data=request.POST)
        if form.is_valid():
            form.save()

    form = AddBookForm()
    return render(request, 'main/add_new_book.html', {'form': form})

页面顶部有一个进度条,每次加载页面时都会显示。当我尝试为一本新书提交信息时,它仍然会出现,但 PyCharm 指示该页面尚未重新加载并且没有发生任何发布请求。数据库中也没有条目。

顺便说一句,这也发生在我在项目中的所有其他表单上。似乎是一个菜鸟错误,但我找不到类似的讨论。

谢谢!


更新

感谢您的输入,我正在取得进展,但我仍然遇到错误。这是我尝试为新书提交信息时得到的结果:

[12/May/2015 16:12:54]"GET /main/add-new/?csrfmiddlewaretoken=FGaEtjH6ntyLSNm923OuYxBoOm9BQ0KN&title=Spiritual+Seduction&author=Jerry+Stocking&product_url=http%3A%2F%2Fwww.amazon.com%2FSpiritual-Seduction-Jerry-Stocking%2Fdp%2F0962959383&category=Spirituality&num_of_chapters=26 HTTP/1.1" 200 24399
[12/May/2015 16:12:54]"GET /static/assets/components/forms_elements_bootstrap-select/bootstrap-select.init.js?v=v2.0.0-rc1&sv=v0.0.1.2&1431436374743 HTTP/1.1" 200 185
[12/May/2015 16:12:54]"GET /static/assets/components/ui_sliders_jqueryui/jqueryui-sliders.init.js?v=v2.0.0-rc1&sv=v0.0.1.2&1431436374743 HTTP/1.1" 200 5282
[12/May/2015 16:12:54]"GET /static/assets/components/core/core.init.js?v=v2.0.0-rc1&1431436374743 HTTP/1.1" 200 7688
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 54178)
----------------------------------------
[12/May/2015 16:12:55]"GET /main/add-new/assets/images/logo/app-logo-style-default.png HTTP/1.1" 200 33624
Traceback (most recent call last):
  File "C:\Python27\lib\wsgiref\handlers.py", line 86, in run
self.finish_response()
  File "C:\Python27\lib\wsgiref\handlers.py", line 128, in finish_response
    self.write(data)
  File "C:\Python27\lib\wsgiref\handlers.py", line 217, in write
self._write(data)
  File "C:\Python27\lib\socket.py", line 324, in write
self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
 [12/May/2015 16:12:55]"GET /main/add-new/assets/images/logo/app-logo-style-default.png HTTP/1.1" 500 59
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 599, in process_request_thread
self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 102, in __init__
super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\SocketServer.py", line 657, in __init__
self.finish()
  File "C:\Python27\lib\SocketServer.py", line 716, in finish
self.wfile.close()
  File "C:\Python27\lib\socket.py", line 279, in close
self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
[12/May/2015 16:12:55]"GET /main/add-new/assets/images/people/100/15.jpg HTTP/1.1" 200 33625
Traceback (most recent call last):
  File "C:\Python27\lib\wsgiref\handlers.py", line 86, in run
self.finish_response()
  File "C:\Python27\lib\wsgiref\handlers.py", line 128, in finish_response
    self.write(data)
  File "C:\Python27\lib\wsgiref\handlers.py", line 217, in write
    self._write(data)
  File "C:\Python27\lib\socket.py", line 324, in write
[12/May/2015 16:12:55]"GET /main/add-new/assets/images/people/100/16.jpg HTTP/1.1" 200 33624
    self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
[12/May/2015 16:12:55]"GET /main/add-new/assets/images/people/100/15.jpg HTTP/1.1" 500 59
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 599, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 102, in __init__
super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\SocketServer.py", line 657, in __init__
self.finish()
  File "C:\Python27\lib\SocketServer.py", line 716, in finish
self.wfile.close()
  File "C:\Python27\lib\socket.py", line 279, in close
self.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 54179)
----------------------------------------
[12/May/2015 16:12:55]"GET /main/add-new/assets/images/people/100/17.jpg HTTP/1.1" 200 33625

【问题讨论】:

  • 这里有2个问题,你应该可能在form.save()之后重定向,另外,为什么form = AddBookForm()而另一个是forms.AddBookForm
  • 我的理解是,如果请求方法是 POST 而不是,我应该为视图提供一种行为方式。如果请求 POST,我的意图是将表单数据保存到数据库,然后返回带有空表单的页面。如果不是 POST 请求,则返回表单页面。我知道从用户的角度来看它并不理想,但我不明白它如何影响这种情况下的结果?
  • 应该POST请求成功后几乎总是重定向。要留在同一个表单页面,唯一的正当理由是表单存在验证错误。
  • 我认为你的 if request.method == 'POST': 条件失败。可能是由于模板代码中的一些问题。删除 if request.method == 'POST' 这一行并尝试。
  • 我想我什至没有提出任何形式的请求。如果我在“if request.method =='POST'”之前输入打印语句,我将不会在控制台中看到它。

标签: python django django-forms


【解决方案1】:

我不知道您所说的“绝对不提交 POST 请求”是什么意思,也不知道这与 PyCharm 有什么关系。

您的视图存在两个问题:在有效 POST 之后您没有重定向,并且在帖子无效时您没有重新显示错误。修复:

def add_new_book(request):
    if request.method == 'POST':
        form = forms.AddBookForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')  # or wherever you want

    else:
        form = forms.AddBookForm()

    return render(request, 'main/add_new_book.html', {'form': form})

【讨论】:

  • 还有一点需要指出的是 OP 滥用了 forms.AddBookFormAddBookForm
【解决方案2】:

这是真的:

def add_new_book(request):
 if request.method == 'POST':
   form = AddBookForm(request.POST)
     if form.is_valid():
        form.save()
 form = AddBookForm(request.POST)
 return render(request, 'main/add_new_book.html', {'form': form})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2020-09-26
    相关资源
    最近更新 更多