Django入门与实践-第19章:主题回复
添加新的URL路由:
myproject/urls.py(完整代码)
给回帖创建一个新的表单:
boards/forms.py ()
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['message', ]
一个新的受@login_required
保护的视图,以及简单的表单处理逻辑
现在我们再会到new_topic视图函数,更新重定向地址(标记为 #TODO 的地方)
@login_required
board = get_object_or_404(Board, pk=pk)
form = NewTopicForm(request.POST)
if form.is_valid():
topic = form.save(commit=False)
# code suppressed ...
return redirect('topic_posts', pk=pk, topic_pk=topic.pk) # <- here
# code suppressed ...
值得注意的是:在视图函数replay_topic中,我们使用topic_pk
,因为我们引用的是函数的关键字参数,而在new_topic视图中,我们使用的是topic.pk
,因为topic
是一个对象(Topic模型的实例对象),.pk
是这个实例对象的一个属性,这两种细微的差别,其实区别很大,别搞混了。
回复页面模版的一个版本:
templates/reply_topic.html
提交回复之后,用户会跳回主题的回复列表:
我们可以改变第一条帖子的样式,使得它在页面上更突出:
templates/topic_posts.html(完整代码)
{% for post in topic.posts.all %}
<div class="card mb-2 {% if forloop.first %}border-dark{% endif %}">
{% if forloop.first %}
<div class="card-header text-white bg-dark py-2 px-3">{{ topic.subject }}</div>
{% endif %}
<div class="card-body p-3">
<!-- code suppressed -->
</div>
{% endfor %}
现在对于测试,已经实现标准化流程了,就像我们迄今为止所做的一样。 在boards/tests 目录中创建一个新文件 test_view_reply_topic.py:
boards/tests/test_view_reply_topic.py ()
这里的精髓在于自定义了测试用例基类ReplyTopicTestCase。然后所有四个类将继承这个测试用例。