我试图通过按标签过滤文章来呈现页面。我希望当用户单击All-articles.html
中的标签时显示相关文章。我不知道该怎么做,也不知道该怎么写代码。
我应该在urls.py
中创建一个路径吗path('tag/<str:tagslug>', views.tag, name='tag'),
以便我可以访问views.py
?
中的url。我如何编写ORM来在views.py
中按标签过滤文章?
任何帮助都会很感激:)谢谢
models.py
class ArticleTags(models.Model):
article = models.ForeignKey('Articles', models.DO_NOTHING)
tag = models.ForeignKey('Tags', models.DO_NOTHING)
class Tags(models.Model):
tag = models.CharField(unique=True, max_length=75)
tagslug = models.SlugField(max_length=200, unique=True, default=None)
class Articles(models.Model):
title = models.CharField(max_length=155)
metatitle = models.CharField(max_length=155)
slug = models.SlugField(unique=True, max_length=155)
summary = models.TextField(blank=True, null=True)
field_created = models.DateTimeField(db_column='_created', blank=True, null=True)
cover = models.ImageField(upload_to="cover", blank=True, default='logo-00-06.png')
views.py
def allarticles(request):
articles_list = Articles.objects.all()
paginator = Paginator(articles_list, 12)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {'page_obj': page_obj}
return render(request, "All-articles.html", context)
All-articles.html
{% for article in page_obj %}
<article>
<div>
<img
src="media/{{ article.cover }}"
alt="menu item"
class="article-photo"
/>
</div>
<header>
<h4>{{ article.title }}</h4>
</header>
</article>
{% endfor %}
您可以首先设置它,以便当用户单击标记时,它通过POST请求将标记名称发送给服务器。然后,您可以通过标记名称过滤文章,并将新上下文返回给模板。
问题是你会有一个页面刷新,除非你通过AJAX或使用e.preventdefault()
如果你要在一个页面上有多个操作,需要HTTP请求,我强烈建议避免页面刷新。
当用户选择一个标记时,发出一个Ajax请求,如下所示:
All-Articles.js
function myAjaxRequest() {
return $.ajax({
type: 'POST',
url: 'your route to the function in views.py (if its the same page, this
will be an empty string)',
data: {filter: yourTag}
})
}
然后使用标签过滤数据并通过Json响应返回。
views.py
def allarticles(request):
if request.is_ajax():
tag = request.POST['filter']
*Now just use the tag to filter your model.*
data = serializers.serialize('json', MyModel.objects.filter(field_name=tag))
return JsonResponse(data, safe=False)
最后,获取响应并将其插入HTML中它所属的位置。您将在Javascript文件中从AJAX调用的返回中获得响应。