Фильтрация помеченных постов блога с помощью промежуточной таблицы в Django
Я пытаюсь вывести страницу, фильтруя посты по тегам. Я хочу, чтобы связанные статьи отображались, когда пользователь нажимает на тег в All-articles.html
Я не уверен, как это сделать или как написать код.
Должен ли я создать путь в urls.py
как
path('tag/<str:tagslug>', views.tag, name='tag'),
чтобы я мог получить доступ к url внутри 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-запрос. Затем вы можете отфильтровать статьи по имени тега и вернуть новый контекст в шаблон.
Проблема в том, что при этом будет происходить обновление страницы, если только вы не делаете это через 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 Response.
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, где ему и место. Вы получите ответ из возврата вызова AJAX в вашем файле Javascript.