可以添加新主题后,用户肯定还想添加几个新条目
再次定义URL->编写视图函数->模板
i.用于添加新条目的表单
- 创建一个与模型Entry相关联的表单
- 这个表单的定制程度高于TopicForm
forms.py
from django import forms
from .models import Topic,Entry
class TopicForm(forms.ModelForm):
--snip--
class EntryForm(forms.ModelForm):
--snip--
#新类EntryForm继承了forms.ModelForm
#它包含的Meta类指出了表单基于的模型以及要在表单中包含哪些字段
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text']
labels = {'text': ' '}
#这里给字段'text'指定了标签'Entry'
widgets = {'text': forms.Textarea(attrs={'cols': 80})}
#通过设置属性widgets来覆盖Django的默认小部件。通过Django使用forms.Textarea定制字段'text'的输入小部件,将文本区域的宽度设置为80列而不是默认的40列。
#定义属性widgets
#小部件(widget)-Html表单元素//如单行文本框,多行文本框,下拉列表
ii.URL模式new_entry
- 包含实参topic_id-让条目与特定主题相关联
- 添加到noways_app/urls.py
urls.py
--snip--
urlpatterns = [
--snip--
#用于添加新条目的页面
path('new_entry/<int:topic_id>/',views.new_entry,
name='new_entry'),
]
#这个url模式与形如http://xxxxx/new_entry/id/的url匹配,其中id是一个与主题ID相匹配的数
代码<int:topic_id>捕获一个数值,并将其赋给变量topic_id
请求的URL与这个模式匹配时,Django将请求和主题ID发送给函数new_entry()
iii.视图函数new_entry()
- 视图函数new_entry()与函数new_topic()很像
- 在views.py中添加如下代码
views.py
from django.shortcuts import render,redirect
from .models import Topic
from .forms import TopicForm,EntryForm
--snip--
def new_entry(request,topic_id):
'''在特定主题中添加新条目,形参topic_id用于存储从URL中获得的值'''
topic = Topic.objects.get(id=topic_id)
#渲染页面和处理表单数据时,使用topic_id来获取针对的主题
if request.method != 'POST'#477
#未提交数据:创建一个空表单
form = EntryForm()
else:
#POST提交的数据:对数据进行处理
form = EntryForm(data=request.POST)
#创建一个EntryForm实例,使用request对象中的POST数据来填充它
if form.is_valid():#检查条目是否有效
new_entry = form.save(commit=False)
#commit=False,让django创建一个新的条目对象,并将其赋给new_entry但不保存到数据库中
new_entry.topic = topic
#将new_entry的属性topic设置为函数开头从数据库中获取的主题
new_entry.save()
#调用save()且无任何实参。把条目保存到数据库,并将其与正确的主题相关联
return redirect('noways_app:topic',topic_id=topic_id)
#调用redirect(重定向到的视图,给视图函数提供的参数)这里要求提供两个参数;
此处重定向到topic(),而这个视图函数需要参数topic_id。视图函数topic()渲染新增条目所属主题的页面,其中的条目列表包含新增的条目
#显示空表单或指出表单数据无效
context = {'topic':topic,'form':form}
return render(request,'noways_app/new_entry.html',context)
iv.模板new_entry
- 模板new_entry类似于模板new_topic
new_entry.html
{% extends 'noways_app/base.html' %}
{% block content %}
1. <p><a href="{% url 'noways_app:topic'topic.id %}">{{topic} }
</a></p>
<p>新增一个条目:</p>
2. <form action="{% url 'noways_app:new_entry' topic.id %}"
method='post'>
{% csrf_topken %}
{{ form.as_p }}
<button name='submit'>上传条目</button>
</form>
{% endblock content %}
- 在页面顶端显示主题,让用户清楚自己处于哪个主题中添加条目,该主题名也是一个链接用于返回到该主题的页面。
- 表单的实参action包含url中的topic_id值,让视图函数能够将新条目关联到正确的主题。除此之外基本与模板new_topic.html相同
v.链接到页面new_entry
- 在显示特定主题的页面中添加到页面new_entry的链接
topic.html
{% extends 'noways_app/base.html' %}
{% block content %}
<p>主题:{{ topic }}</p>
<p>条目:</p>
<p>
<a href="{% url 'noways_app' topic.id %}">新增一个条目</a>
</p>
<ul>
--snip--
</ul>
{% endblock content %}
文章评论