用ModelForm创建基于表单的页面
之前创建了两个页面,分别是主页index、主题页topics和单个主题详情页topic,
下面,创建基于表单的页面,使得用户可以添加主题。
1.首先创建/learning_logs/forms.py
文件
from django import forms
# 从models.py导入Topic类
from .models import Topic
class TopicForm(forms.ModelForm): # TopicForm继承forms.ModelForm
class Meta:
model = Topic # 根据模型Topic创建表单model
fields = ['text'] # 表单只包含text字段
labels = {
'text': ''} # 不要为labels生成标签
2.在/learning_logs/urls.py中添加:
# web page used to add new topics
path('new_topic/', views.new_topic, name='new_topic'),
这个规则匹配localhost:port/new_topic/
的访问,并且调用views.py
中的new_topic
函数,同时为该url命名为new_topic
3.创建视图函数new_topic()
首先要在原来的基础上import
以下:
from django.http import HttpResponseRedirect
from django.urls import reverse
from .forms import TopicForm
def new_topic(request):
"""add new topic"""
if request.method != 'POST':
# didn't submit data: create a new form
form = TopicForm # TopicForm is imported from ./form.py
else:
# data submitted through post: process the data
form = TopicForm(request.POST)
if form.is_valid():
form.save()
# redirect user to topics page
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {
'form': form}
return render(request, 'learning_logs/new_topic.html', context)
如果请求!=POST,那么可能是GET请求;就创建一个新的表单,并且存放在上下文context
中,然后通过render返回给new_topic.html
,显示给用户一个空表单,
如果请求是POST,我们就要使用存储在request.POST中的用户填写的数据来创建一个TopicForm实例form,它包含了用户填写的信息,
通过form.is_valid()
可以检查信息的有效与否,然后存储到数据库。
接下来,可以离开页面,先用reverse来获取名称为topics
的页面的url,再重定向至topics
页面。
4.创建new_topic.html