前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战篇-论坛回帖视图

Django实战篇-论坛回帖视图

作者头像
小团子
发布2019-07-18 15:44:00
5150
发布2019-07-18 15:44:00
举报
文章被收录于专栏:数据云团数据云团

使用 Django 的模型,都是 django.db.models.Model 类的子类。

  • 每个类将被转成数据库表。
  • 每个字段由 django.db.models.Field 子类转成数据库的列。
  • 模型之间的关系使用 ForeignKey 字段。
  • 位置参数 related_name 用于引用关联的模型。
  • related_name 参数将用于创建反向关系。

在 论坛的回帖模型中,related_name = "+",不需要这种反向关系,不需要关系用户修改过哪些帖子。

代码语言:javascript
复制
from django.shortcuts import render, get_object_or_404, redirect, reverse
from django.contrib.auth.decorators import login_required
from django.views.generic import UpdateView, ListView
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.db.models import Count
from .forms import NewTopicForm, PostForm
from .models import Board, Topic, Post

① 主题回复

代码语言:javascript
复制
class PostListView(ListView):
    model = Post
    context_object_name = 'posts'
    template_name = 'board/topic_posts.html'
    # 主题回复列表, 复用分页组件
    paginate_by = 20

    def get_context_data(self, **kwargs):
        # 防止相同用户刷新页面被统计为多次访问 ,使用 会话 sessions
        session_key = 'viewed_topic_{}'.format(self.topic.pk)
        if not self.request.session.get(session_key, False):
            self.topic.views += 1
            self.topic.save()
            self.request.session[session_key] = True

        kwargs['topic'] = self.topic
        return super().get_context_data(**kwargs)

    def get_queryset(self):
        self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk=self.kwargs.get('topic_pk'))
        queryset = self.topic.posts.order_by('created_at')
        return queryset

② 回帖

代码语言:javascript
复制
@login_required
def reply_topic(request, pk, topic_pk):
    topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk)

    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.topic = topic
            post.created_by = request.user
            post.save()

            # 更新回复帖子的时间
            topic.last_updated = timezone.now()
            topic.save()

            # 回复帖子 重定向到本页
            topic_url = reverse('users:new_posts', kwargs={"pk": pk, "topic_pk": topic_pk})
            topic_post_url = '{url}?page={page}#{id}'.format(
                url=topic_url,
                id=post.pk,
                page=topic.get_page_count()
            )
            return redirect(topic_post_url)
    else:
        form = PostForm()
    return render(request, 'board/reply_topic.html', {"topic": topic, "form": form})

③ 编辑帖子

代码语言:javascript
复制
@method_decorator(login_required, name='dispatch')
class PostUpdateView(UpdateView):
    model = Post
    fields = ('message',)
    template_name = 'board/edit_post.html'
    pk_url_kwarg = 'post_pk'
    context_object_name = 'post'

    # 其他用户可以编辑所有帖子的问题
    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(created_by=self.request.user)

    def form_valid(self, form):
        post = form.save(commit=False)
        post.updated_by = self.request.user
        post.updated_at = timezone.now()
        post.save()
        return redirect("users:new_posts", pk=post.topic.board.pk, topic_pk=post.topic.pk)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档