Django入门与实践-第19章:主题回复

    添加新的URL路由:

    myproject/urls.py()

    给回帖创建一个新的表单:

    boards/forms.py (完整代码)

    1. from .models import Post
    2. class PostForm(forms.ModelForm):
    3. class Meta:
    4. model = Post
    5. fields = ['message', ]

    一个新的受@login_required保护的视图,以及简单的表单处理逻辑

    现在我们再会到new_topic视图函数,更新重定向地址(标记为 #TODO 的地方)

    1. @login_required
    2. board = get_object_or_404(Board, pk=pk)
    3. form = NewTopicForm(request.POST)
    4. if form.is_valid():
    5. topic = form.save(commit=False)
    6. # code suppressed ...
    7. return redirect('topic_posts', pk=pk, topic_pk=topic.pk) # <- here
    8. # code suppressed ...

    值得注意的是:在视图函数replay_topic中,我们使用topic_pk,因为我们引用的是函数的关键字参数,而在new_topic视图中,我们使用的是topic.pk,因为topic是一个对象(Topic模型的实例对象),.pk是这个实例对象的一个属性,这两种细微的差别,其实区别很大,别搞混了。

    回复页面模版的一个版本:

    templates/reply_topic.html

    5-10.png

    提交回复之后,用户会跳回主题的回复列表:

    我们可以改变第一条帖子的样式,使得它在页面上更突出:

    templates/topic_posts.html()

    1. {% for post in topic.posts.all %}
    2. <div class="card mb-2 {% if forloop.first %}border-dark{% endif %}">
    3. {% if forloop.first %}
    4. <div class="card-header text-white bg-dark py-2 px-3">{{ topic.subject }}</div>
    5. {% endif %}
    6. <div class="card-body p-3">
    7. <!-- code suppressed -->
    8. </div>
    9. {% endfor %}

    现在对于测试,已经实现标准化流程了,就像我们迄今为止所做的一样。 在boards/tests 目录中创建一个新文件 test_view_reply_topic.py

    boards/tests/test_view_reply_topic.py (完整代码)

    这里的精髓在于自定义了测试用例基类ReplyTopicTestCase。然后所有四个类将继承这个测试用例。