• 136-使用django实现收藏功能


    功能概要:

    1. 只能收藏其他人的设置为开放的文章
    2. 如果收藏后,对应用户将文章设置为私有,记录保存,但是不能前往,提示已设置为私有
    3. 通过收藏一键完成,但不会直接打开收藏界面
    4. 收藏只产生简要信息的列表,通过链接打开原始文章
    5. 在收藏界面,只显示自己的收藏内容

    【1】收藏模型。

    模型会建立和文章的多对一关系,然后记录谁收藏,文章作者,文章标题,收藏时间。

    class CltNote(models.Model):
        clt_relation_note = models.ForeignKey(MyNote, on_delete=models.CASCADE, related_name='clt_note')
        who_clt = models.CharField(max_length=64)
        author = models.CharField(max_length=64)
        title = models.CharField(max_length=64)
        clt_time = models.DateTimeField(auto_now_add=True)
    

      

    【2】进行收藏时的模板设计。

    首先判断当前用户是不是文章的作者,如果是就可以进行“编辑”,如果不是就可以进行“收藏”相关操作;

    然后判断是否已经收藏,如果是,显示提示并且不能进行收藏操作;如果否,提供一个链接,执行views里的某个函数。

    {% if request.user.username == pk_note.author %}
                    <p><a href="{% url 'notebook:edit_note' pk_note.pk %}">编辑</a></p>
                {% else %}
                    {% if if_collect %}
                        <p>已收藏</p>
                    {% else %}
                    <a href="{% url 'notebook:clt_note' pk_note.pk %}">收藏</a>
                    {% endif %}
                {% endif %}
    

      

    【3】收藏函数的相关处理。

    这个函数里,仍然要首先获得用户和文章作者,然后获取收藏模型相关信息,存入数据库;

    再将文章的被收藏数+1,然后保存文章。

    # 实现收藏功能,保存相关数据
    @login_required
    def clt_note(request, pk):
        current_user = request.user
        pk_note = get_object_or_404(MyNote, open_bool=True, id=pk)
        new_clt_note = CltNote()
        new_clt_note.who_clt = current_user.username
        new_clt_note.clt_relation_note = pk_note
        new_clt_note.author = pk_note.author
        new_clt_note.title = pk_note.title
        new_clt_note.save()
        pk_note.collect_count += 1
        pk_note.save()
        return HttpResponseRedirect(reverse('notebook:op_one_note', args=[pk]))
    

      

    【4】显示收藏,views部分。

    由于收藏的界面继承自首页,因此需要调用get_ten_comment函数,并获取其返回值;

    然后获取用户信息;

    获取所有的收藏信息中,需要过滤收藏者信息,使界面中只显示自己的收藏记录;

    仍然使用翻页显示方法,基本可以照搬使用。

    def all_clt_note(request, page_id):
        # 调用一个函数并获得其返回值
        ten_comment = get_ten_comment(request)
        current_user = request.user
        all_clt_notes = CltNote.objects.filter(who_clt=current_user.username).order_by('-clt_time')
        paginator_page = Paginator(all_clt_notes, 30)
        page_obj = paginator_page.get_page(page_id)
        context = {'page_obj': page_obj, 'ten_comment': ten_comment}
        return render(request, 'all_clt_note.html', context)
    

      

    【5】显示收藏,模板部分。

    上半部分处理收藏信息,下半部分处理翻页功能,翻页功能基本照搬使用;

    在判断是否可以前往到具体文章时,判断这篇文章当前是否仍然设置为开放:open_bool = True,这里使用外链的方式获取;

    注意在判断True/False时,直接if即可,不要使用=或==,使用=和==都会报错!

    {% block content %}
    <div class="left">
    
        {# show all collect notes with page_id #}
        <div>
        {% for clt_note in page_obj %}
            <p>
                <span>收藏时间:{{clt_note.clt_time}}</span>
                <span>作者:{{clt_note.author}}</span>
                <span>标题:{{clt_note.title}}</span>
                {% if clt_note.clt_relation_note.open_bool %}
                    <a href="{% url 'notebook:op_one_note' clt_note.clt_relation_note.pk %}">前往</a>
                {% else %}
                    <span>作者已设为私有</span>
                {% endif %}
    
            </p>
        {% endfor %}
        </div>
    
        {# function of previous and next  #}
        <div>
        <span>
        {% if page_obj.has_previous %}
            <a href="{% url 'notebook:all_clt' 1 %}">从头</a>
            <a href="{% url 'notebook:all_clt' page_obj.previous_page_number %}">上一页</a>
        {% endif %}
    
            <span>
                {{page_obj.number}} of {{page_obj.paginator.num_pages}}
            </span>
    
        {% if page_obj.has_next %}
            <a href="{% url 'notebook:all_clt' page_obj.next_page_number %}">下一页</a>
            <a href="{% url 'notebook:all_clt' page_obj.paginator.num_pages %}">到尾</a>
        {% endif %}
        </span>
        </div>
    
    </div>
    {% endblock content %}
    

      

      

    django要实现收藏功能也很简单。设计一个好的模型至关重要!!!

      

  • 相关阅读:
    java线程池源码阅读
    websocketcometd源码阅读基于注解初始化(三)
    websocketcometd源码阅读与spring整合初始化(四)
    cometd源码阅读初始化(二)
    cometd源码阅读WebSocketTransport普通消息处理过程(八)
    websocketcometd源码阅读transport(五)
    一.安装软件
    GitHub一篇文章系列
    JavaJVM调优jstack找出最耗cpu的线程&定位问题代码
    Git总目录
  • 原文地址:https://www.cnblogs.com/lzhshn/p/13626118.html
Copyright © 2020-2023  润新知