Фильтрация помеченных постов блога с помощью промежуточной таблицы в 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.

Вернуться на верх