我试图在旁边的一栏中显示类似的帖子。像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在主视频右侧有视频和类似视频的网站是那些视频,因为它们共享相似的标签吗?欢迎任何和所有的帮助。
答案 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 并且易于使用:
您安装
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_objects()
方法:
返回类似标记的其他对象的列表(不是惰性QuerySet) 对于这一个,先订购最相似的。
修改强>
要检索类似帖子,您应该使用:
similar_posts = instance.tags.similar_objects()
并且只获得第一个,比方说,5个类似的帖子:
similar_posts = instance.tags.similar_objects()[:5]
其中instance
是Post
模型的实例。