在 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 获得响应。