通过从模板传递子弹来进行Django动态过滤

时间:2018-10-24 12:59:52

标签: django url view filtering

因此,我已经阅读了有关Django动态过滤的这篇文章; Dynamic filtering

尽管我有一些工作要做,但我需要两个类似的视图,一个视图以其子标题作为参数显示所有不同类别,第二个视图以不带参数的形式显示所有类别的所有帖子。

如何使用单个ListView并从模板传递空参数以显示列表中所有类别的所有帖子?

还是有可能吗?

urls.py

urlpatterns = [
  path('', views.PostListView.as_view(), name='index'),
  path('<slug:slug>/', views.PostbyCategoryListView.as_view(), name="category"),
]

views.py

class PostListView(ListView):
  model = Post
  template_name = 'index.html'

class PostbyCategoryListView(ListView):
  model = Post
  template_name = 'index.html'

  def get_queryset(self):
    self.category = get_object_or_404(Category, slug=self.kwargs['slug'])

    return Post.objects.filter(category=self.category)

index.html

...
  <h6>Categories</h6>
  {% if category_list %}
    <ul>
      <li class="category-item">
        <a href="{% url 'index' %}">All categories</a>
      </li>
      {% for category in category_list %}
        <li class="category-item">
          <a href="{% url 'category' category.slug %}">{{ category.name }}</a>
        </li>
      {% endfor %}
    </ul>
  {% else %}
      <p>No categories</p>
  {% endif %}
...

models.py

class Category(models.Model):
  name = models.CharField(max_length=200)
  slug = models.CharField(max_length=200)

class Post(models.Model):
  category = models.ForeignKey('Category',default=1, on_delete=models.SET_NULL, null=True, related_name="posts")
  title = models.CharField(max_length=200)
  content = models.TextField(max_length=2000)

0 个答案:

没有答案