这一节,我们添加表单项,让用户可以选择自己输入数据。这一节的代码几乎都是模板代码,如果一开始不理解的话,照着抄就可以了。
1、在应用路径下新建 forms.py 文件,输入以下代码
from django import forms
from blog.models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
labels = {'text':'请输入话题内容'}
知识点:
(1)最简单的 ModelForm 类只包含了一个内嵌的 Meta 类,它的作用是告诉 Django 使用哪个模型创建表单,以及在表单中包含哪些字段;
(2)
model = Topic
表示,我们根据模型 Topic 创建表单;
(3)
fields = ['text']
表示,该表单只包含字段“text”
2、配置 urls
# 用于添加新主题的网页
url(r'^new_topic/$', views.new_topic, name='new_topic')
3、配置 views
def new_topic(request):
"""添加新主题"""
if request.method != 'POST':
# 未提交数据,创建一个新表单
form = TopicForm()
else:
# POST 提交的数据,对数据进行处理
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'blog/new_topic.html', context)
知识点:
(1)HttpResponseRedirect
:用户提交了主题以后,我们将使用这个类将用户重定向到网页 ‘learning_logs:topics’;
(2)不要忘记掉写 reverse('learning_logs:topics')
中的 reverse。
函数 reverse()
根据指定的 URL 模型确定 URL,这意味着 Django 将在页面被请求时生成 URL。
4、配置模板 new_topic.html
{% extends "blog/base.html" %}
{% block content %}
<form action="{% url 'blog:new_topic' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
{% endblock content %}
知识点:
(1)模板标签 {% csrf_token %}
:来防止攻击者利用表单来获得对服务器未经授权的访问,这种攻击被称为“跨站请求伪造”;
(2)模板变量 {{ form.as_p }}
:我们显示表单,从中可以知道 Django 使得完成显示表单的任务有多简单:我们只需要包含模板变量 {{ form.as_p }}
,就可以让 Django 自动创建显示表单所需的全部字段。
修饰符 as_p
让 Django 以段落的格式渲染所有的表单元素,这是一种整洁地显示表单的简单方式;
(3)记住模板标签和模板变量长什么样。
在话题列表页面,添加新话题的链接。
{% extends 'blog/base.html' %}
{% block content %}
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'blog:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>话题没有被创建。</li>
{% endfor %}
</ul>
<a href="{% url 'blog:new_topic' %}">添加新的话题</a>
{% endblock content %}