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

时间:2016-01-31 14:06:44

标签: python django

我试图在旁边的一栏中显示类似的帖子。像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 %}

这是我的观点

 def post_detail(request, slug=None):
    instance = get_object_or_404(Post, slug=slug)
    if instance.publish > timezone.now().date() or instance.draft:
        if not request.user.is_staff or not request.user.is_superuser:
            raise Http404
    share_string = quote_plus(instance.content)
    context = {
        "title": "detail",
        "instance": instance,
        "share_string": share_string,
    }
    return render(request, "posts/post_detail.html", context)

如果这种方法超出语法修正并需要重写。我不介意用正确的方式写它。这是我与Django合作的第二个月。对我来说这种方式很有意义,但它没有用。像youtube在主视频右侧有视频和类似视频的网站是那些视频,因为它们共享相似的标签吗?欢迎任何和所有的帮助。

2 个答案:

答案 0 :(得分:2)

你应该告诉我们什么是不匹配的。

您的post_detail尝试查找带有标记slug的帖子。

instance = get_object_or_404(Post, slug=slug)

我怀疑这是你的意图。

get_object_or_404要么试图找到完全匹配,要么引发错误 由于您的原始帖子包含标记,因此您将获得相同的帖子或多个帖子。

下面的代码块不是你想要的。

        {% for tag in instance.tags.all %}
        <h4> <a href="{% url 'posts:detail' slug=tag.slug %}"> {{ tag.title }}</a>  </h4><hr>
        {% endfor %}

它列出了原始帖子的所有标签,未列出相关帖子(通过标签)

如果您想显示相关帖子,并且您打算使用tag来定义relatedness,请在帖子模型中定义一个方法以返回此类相关帖子。

def get_related_posts_by_tags(self):
    return Post.objects.filter(tags__in=self.tags.all())
  

那些视频是因为它们共享相似的标签吗?

不确定他们如何评判相关性,你应该在另一个问题中提出这个问题 如果我不得不猜测,它不仅仅是标记比较。

**编辑

实际上,relatedness的正确用语是similarity

您可以通过Google搜索document similarity找到更多信息。

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

答案 1 :(得分:1)

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

  1. 您安装

    pip install django-taggit
    
  2. 将其添加到已安装的应用中:

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

    from django.db import models
    
    from taggit.managers import TaggableManager
    
    class YourModel(models.Model):
        # ... fields here
    
        tags = TaggableManager()
    

    你可以在你的观点中使用它:

    all_tabs = instance.tags.all()
    
  4. 它甚至有一个similar_objects()方法:

      

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

    修改

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

    similar_posts = instance.tags.similar_objects()
    

    并且只获得第一个,比方说,5个类似的帖子:

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

    其中instancePost模型的实例。