131 lines
4.8 KiB
Markdown
131 lines
4.8 KiB
Markdown
|
|
# 如何使用 Python Django 表单
|
|||
|
|
|
|||
|
|
> 原文:<https://www.pythoncentral.io/how-to-use-python-django-forms/>
|
|||
|
|
|
|||
|
|
## Django 形式
|
|||
|
|
|
|||
|
|
什么是 HTML 表单?它有什么样的用例?
|
|||
|
|
|
|||
|
|
> 网页上的 web 表单、web 表单或 HTML 表单允许用户输入发送到服务器进行处理的数据。表单可以类似于纸张或数据库表单,因为 web 用户使用复选框、单选按钮或文本字段来填写表单。例如,表单可用于输入运输或信用卡数据以订购产品,或者可用于从搜索引擎检索搜索结果。
|
|||
|
|
>
|
|||
|
|
> [Wikipedia](https://en.wikipedia.org/wiki/Form_(HTML) "Webforms on Wikipedia")
|
|||
|
|
|
|||
|
|
HTML 表单是从客户端应用程序向服务器发送数据的最常见方式。在本文中,我们将学习如何使用 Django 的表单库来处理 HTML 表单。
|
|||
|
|
|
|||
|
|
## 使用 Django 表单库的好处
|
|||
|
|
|
|||
|
|
在之前的一篇文章中,[为您的第一个 Python Django 应用程序](https://www.pythoncentral.io/writing-views-to-upload-posts-for-your-first-python-django-application/ "Writing Views to Upload Posts for Your First Python Django Application")编写上传帖子的视图,我们学习了如何使用`request.POST`变量从 HTML 表单中检索数据。然而,仅仅检索数据是不够的,因为我们可能希望处理数据验证,并避免在模板中手动编写 HTML 表单。
|
|||
|
|
|
|||
|
|
幸运的是,Django 的表单库提供了以下好处:
|
|||
|
|
|
|||
|
|
* 从表单小部件自动生成 HTML 表单。
|
|||
|
|
* 根据一组规则验证提交的数据。
|
|||
|
|
* 如果有错误,重新显示 HTML 表单。
|
|||
|
|
* 将提交的数据转换成 Python 兼容的类型。
|
|||
|
|
|
|||
|
|
### 基本概念
|
|||
|
|
|
|||
|
|
在我们深入讨论编写表单的细节之前,我们需要了解以下概念:
|
|||
|
|
|
|||
|
|
* **Widget** :一个 Python 类,将自己呈现为 HTML 形式。
|
|||
|
|
* **字段**:验证数据的 Python 类,例如限制最大字符数的`CharField`。
|
|||
|
|
* **表单**:字段的集合。
|
|||
|
|
* **表单资产**:与呈现表单相关联的 CSS 和 Javascript。
|
|||
|
|
|
|||
|
|
设计正确的话,`Form`库与其他 Django 组件是分离的,比如数据库层甚至模板。通过将`Form`库与 Django 的其余部分分离,我们可以独立于应用程序的其余部分编写和测试表单,这增加了应用程序的可维护性。
|
|||
|
|
|
|||
|
|
### 表单和视图
|
|||
|
|
|
|||
|
|
现在让我们继续创建一个表单对象,它表示`myblog/forms.py`中的一个`Post`。
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
|
|||
|
|
from django import forms
|
|||
|
|
类后置形式(形式。形式):
|
|||
|
|
内容=形式。CharField(max _ length = 256)
|
|||
|
|
created _ at = forms。DateTimeField()
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后我们创建一个新的视图,返回我们在上下文中的表单。
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
|
|||
|
|
from myblog.forms import PostForm
|
|||
|
|
def POST _ Form _ Upload(request):
|
|||
|
|
if request . method = = ' GET ':
|
|||
|
|
Form = PostForm()
|
|||
|
|
else:
|
|||
|
|
# A POST 请求:处理表单上传
|
|||
|
|
form = PostForm(request。POST) #从请求绑定数据。投寄成一种邮件形式
|
|||
|
|
#如果数据有效,则继续创建新的帖子并重定向用户
|
|||
|
|
If form . is _ valid():
|
|||
|
|
content = form . cleaned _ data[' content ']
|
|||
|
|
created _ at = form . cleaned _ data[' created _ at ']
|
|||
|
|
post = m . post . objects . create(content,
|
|||
|
|
created _ at = created _ at)
|
|||
|
|
return httpresponseredict(reverse(' post _ detail ',
|
|||
|
|
kwargs={'post_id': post.id})
|
|||
|
|
return render(request,' post/post_form_upload.html ',{
|
|||
|
|
'form': form,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后我们创建一个新的模板,在`myblog/templates/post_form_upload.html`的 HTML 页面中呈现我们的表单。
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
|
|||
|
|
<form action='/post/form_upload.html' method='post'>{% csrf_token %}
|
|||
|
|
|
|||
|
|
{{ form.as_p }}
|
|||
|
|
|
|||
|
|
<input type='submit' value='Submit' />
|
|||
|
|
|
|||
|
|
</form>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
最后,我们修改`myblog/urls.py`以追加以下条目:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
|
|||
|
|
urlpatterns = patterns('',
|
|||
|
|
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
url(r'^post/form_upload.html$',
|
|||
|
|
|
|||
|
|
'myblog.views.post_form_upload', name='post_form_upload'),
|
|||
|
|
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
现在我们可以访问 URL `http://localhost:8000/post/form_upload.html`来看看我们新的帖子表单页面:
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
我们的空表单页面。
|
|||
|
|
|
|||
|
|
填写表格并点击“提交”会将您重定向到新帖的详细信息页面:
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
我们的表格填好了。
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
提交后我们的页面。
|
|||
|
|
|
|||
|
|
因为“内容”和“创建者”字段都是必填的,所以当您试图上传一个空字段时,会出现一个错误。
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
所需输入误差..
|
|||
|
|
|
|||
|
|
## 总结和提示
|
|||
|
|
|
|||
|
|
在本文中,我们学习了如何使用 Django 的表单库来处理 HTML 表单。虽然手工创建 HTML 表单是常见的做法,但是创建 Django 的表单对象可以提供更好的可维护性、可读性和功能性。在下一篇文章中,我们将学习如何使用 Django 的`ModelForm`从模型中自动生成表单。
|