在Django中使用中间表过滤带标签的博客文章



我试图通过按标签过滤文章来呈现页面。我希望当用户单击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调用的返回中获得响应。

相关内容

  • 没有找到相关文章

最新更新