在 Django 中使用中间 table 过滤标记的博客文章
Filtering tagged blog posts using intermediate table in 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 请求将标签名称发送到服务器。然后,您可以通过标签名称和 return 模板的新上下文过滤文章。
问题是您将刷新页面,除非您通过 AJAX 或使用 e.preventdefault()
如果您要在一个需要 HTTP 请求的页面上执行多项操作,我强烈建议您避免刷新页面。
当用户选择标签时,发出一个 Ajax 请求,如下所示:
全部-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 响应 return。
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 调用的 return 获得响应。
我正在尝试通过按标签过滤文章来呈现页面。我希望当用户点击 All-articles.html
中的标签时显示相关文章我不确定如何去做或我将如何编写代码。
我应该在 urls.py
中创建一个路径吗?
path('tag/<str:tagslug>', views.tag, name='tag'),
这样我就可以在 views.py
?
我将如何编写 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 请求将标签名称发送到服务器。然后,您可以通过标签名称和 return 模板的新上下文过滤文章。
问题是您将刷新页面,除非您通过 AJAX 或使用 e.preventdefault()
如果您要在一个需要 HTTP 请求的页面上执行多项操作,我强烈建议您避免刷新页面。
当用户选择标签时,发出一个 Ajax 请求,如下所示:
全部-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 响应 return。
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 调用的 return 获得响应。