Python 如何使用django将类似的帖子添加到详细信息页面

Python 如何使用django将类似的帖子添加到详细信息页面,python,django,Python,Django,我试着在旁边的专栏中展示与一篇文章类似的帖子。一些像youtube这样的网站甚至出现了堆栈溢出。由于没有人询问,我假设旁边列出的文章都是带有类似标签的文章。但它不起作用,它说什么都不匹配。这是我在post_detail.html中的内容: {% block content %} <div class="row" style="margin-top: 70px"> <div class="col-sm-8"> {% if instance.ima

我试着在旁边的专栏中展示与一篇文章类似的帖子。一些像youtube这样的网站甚至出现了堆栈溢出。由于没有人询问,我假设旁边列出的文章都是带有类似标签的文章。但它不起作用,它说什么都不匹配。这是我在post_detail.html中的内容:

{% block content %}

<div class="row" style="margin-top: 70px">

    <div class="col-sm-8">
        {% if instance.image %}
            <img src='{{ instance.image.url }}' class="img-responsive" />
        {% endif %}


    <p>Share on:
    <a href="https://www.facebook.com/sharer/sharer.php?u={{ request.build_absolute_uri }}">
    Facebook
    </a>

    <a href="https://twitter.com/home?status={{ instance.content | truncatechars:80 | urlify }}%20{{ request.build_absolute_uri }}">
     Twitter
    </a>


    <a href='https://plus.google.com/share?url={{ request.build_absolute_uri }}'></a>


    <a href="https://www.linkedin.com/shareArticle?mini=true&url={{ request.build_absolute_uri }}&title={{
    instance.title }}&summary={{ share_string }}&source={{ request.build_absolute_uri }}">
     Linkedin
    </a>
    </p>

        <h1>{{ title }}<small>{% if instance.draft %}<span style="color:red"> Draft</span>{% endif %} {{instance.publish}}</small></h1>


        {% if instance.user.get_full_name %}
        <p>By {{ instance.user.get_full_name }}</p>
        {% else %}
            <p>Author {{ instance.user }}</p>
        {% endif  %}

        <p><a href='{% url "posts:list" %}'>Back</a></p>
        <p><a href='{% url "posts:delete" instance.id %}'>delete</a></p>
        <p>{{instance.content | linebreaks }}</p>
        <hr> 

    </div>

    <div class="panel panel-default pull-right" style="height: 1000px">
        <div class="panel-heading">
        <h3 class="panel-title">Similar Articles</h3>
      </div>
      ==========right here====================
        <div class="panel-body">
            {% for tag in instance.tags.all %}
            <h4> <a href="{% url 'posts:detail' slug=tag.slug %}"> {{ tag.title }}</a>  </h4><hr>
            {% endfor %}
        </div>
       ==========right here====================
    </div>


</div>

{% endblock content %}

如果此方法超出语法更正范围,需要重写。我不介意用正确的方式写。这是我在Django工作的第二个月。对我来说,这种方式是有道理的,但它不起作用。像youtube这样的网站在主视频的右边有一个视频和类似的视频,这些视频在那里是因为它们共享类似的标签吗?欢迎提供任何帮助。

您应该让我们知道哪些不匹配

您的
post\u detail
尝试查找带有标签slug的帖子

instance=get\u object\u或\u 404(Post,slug=slug)

我怀疑那是你的本意

get\u object\u或_404
尝试查找精确匹配或引发错误。
由于您的原始帖子有标签,您将获得相同的帖子或多个帖子

下面的代码块也不是您所希望的

        {% for tag in instance.tags.all %}
        <h4> <a href="{% url 'posts:detail' slug=tag.slug %}"> {{ tag.title }}</a>  </h4><hr>
        {% endfor %}
这些视频存在是因为它们共享相似的标签吗

不确定他们是如何判断相关性的,你应该在另一个问题中提问。
如果我不得不猜测的话,这将不仅仅是标签比较

**编辑

实际上,
相关性的恰当术语是
相似性

您可以通过谷歌搜索
文档相似性
找到更多信息

{% for post in instance.get_related_post_by_tag %}
// href to post.absolute_url
{% endfor %}

从长远来看,不使用已经尝试和测试过的可重用Django应用程序重新发明轮子是明智的做法。在您的情况下,有这样的应用程序: 并且易于使用:

  • 你安装它

    pip install django-taggit
    
  • 将其添加到已安装的应用程序:

    INSTALLED_APPS = [
        ...
        'taggit',
    ]
    
  • 将其自定义管理器添加到要添加标记的模型中

    from django.db import models
    
    from taggit.managers import TaggableManager
    
    class YourModel(models.Model):
        # ... fields here
    
        tags = TaggableManager()
    
    您可以在视图中使用它:

    all_tabs = instance.tags.all()
    
  • 它甚至有一种方法:

    返回标记类似的其他对象的列表(不是惰性查询集) 对于这一个,先订购最相似的

    编辑

    要检索类似的帖子,您应该使用:

    similar_posts = instance.tags.similar_objects()
    
    如果只获得第一个,比方说,5个类似的帖子:

    similar_posts = instance.tags.similar_objects()[:5]
    

    其中
    instance
    Post
    模型的一个实例。

    这是我词汇表中的一个新词,也是我一直在寻找的术语。我如何表现出关联性。我不知道他们的关系是如何建立在什么网站上的。我认为它是基于标签的。你的方式看起来不错,但是我如何链接到Post.objects.filter(tags\uu in=self.tags.all())返回的帖子?谢谢你的回复。但是我如何链接到类似的帖子呢?我将最终切换到taggit,因为在尝试使用它之前,有人建议我使用它,它破坏了我的应用程序。我一开始就得用它。我现在只使用Django大约两个月了。我在学习一个教程,所以我在模仿他是怎么做的。我试着把它弄乱了一个小时。但是谢谢
    similar_posts = instance.tags.similar_objects()
    
    similar_posts = instance.tags.similar_objects()[:5]