除了添加新的主题,我们也可以添加新的条目。为此我们需要在forms.py中添加一个新的类。
1.用于添加新条目的表单
forms.py
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
--snip--
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text'] #只包含字段text
labels = {'text': ''} #给字段text指定了一个空的标签
widgets = {'text': forms.Textarea(attrs={'cols': 80})} # 定义属性widgets
定义属性widgets,其是一个HTML表单元素,如单行文本框、多行文本区域或下拉列表。通过设置属性widgets,可覆盖Django的默认小部件。通过使用forms.Textarea,定制了字典‘text’的输入小部件,将文本区域的宽度设置为80列而不是默认的40列。
2.URL模式new_entry
learning_logs/urls.py
http://localhost:8000/new_entry/ id/
from django.conf.urls import url
from . import views
urlpatterns = [
--snip--
# ?P<topic_id> 捕获一个数值,并且将其保存在变量topic_id中
# 当请求的URL与这个模式匹配时,Django将请求和主题ID发送给new_entry()中
url(r'^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'),
]
3.视图函数new_entry()
views.py
from django.shortcuts import render
--snip--
from .models import Topic
from .forms import TopicForm, EntryForm
--snip--
def new_entry(request, topic_id):
# 使用topic_id获取正确的主题
topic = Topic.objects.get(id=topic_id)
if request.method != 'POST':
form = EntryForm()
else:
form = EntryForm(data=request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.topic = topic
new_entry.save()
# 调用reverse时,需要提供两个实参:要根据它来生成URL。列表args,其中包含要包含在URL中所有实参。
return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic_id]))
# 向网页传递参数
context = {'topic': topic, 'form': form}
return render(request, 'learning_logs/new_entry.html', context)
4.模板new_entry.html
new_entry.html
{% extends "learning_logs/base.html" %}
{% block content %}
<!--我们在页面的顶端显示了主题,以告诉用户其所在主题。同时它也是一个链接,可用于返回该主题的主页面-->
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Add a new entry:</p>
<!--!--定义一个HTML表单,实参aciton告诉要把提交的表单的发送到哪里,我们将它返回视图函数new_entry(),实参method让浏览器使用POST方法提交数据-->
<form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>add entry</button>
</form>
{% endblock content %}
5.链接到页面new_entry
topic.html
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Topic: {{ topic }}</p>
<p>Entries:</p>
<!-- link to the page of new_entry -->
<p>
<a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
</p>
<ul>
--snip--
</ul>
{% endblock content %}