【问题标题】:How to filter a ListView output based on ID from current URL如何根据当前 URL 中的 ID 过滤 ListView 输出
【发布时间】:2020-07-30 03:24:39
【问题描述】:

我的项目是一个购物清单。我有两个模型: ShoppingList 和 ShoppingItem 像这样:

models.py

class ShoppingItem (Model):
    name = models.CharField(max_length=50, null=False)
    count = models.IntegerField(null=False)
    list = models.ForeignKey(ShoppingList, on_delete=models.CASCADE, related_name='shopping_items')
    date_created = models.DateTimeField(auto_now_add=True)

urls.py

urlpatterns = [
    path('ListDetails/<int:pk>', views.ListDetailUpdateView.as_view(), name='listdetailupdate'),
]

views.py

class ListDetailUpdateView(ListView):
    model = ShoppingItem
    template_name = 'xlist_app/ListDetailUpdateView.html'
    context_object_name = 'products'
    queryset = ShoppingItem.objects.filter(list = XXXX)

我需要返回部分 url 但在 ListView(where"XXXX") 内的函数

我的想法是剪掉 url 的最后一部分(例如,当我输入列表编号 2 时,我的地址为 http://127.0.0.1:8000/ListDetails/2)并用这样的函数替换“XXXX”。

在我看来应该是这样的:

queryset = ShoppingItem.objects.filter(list = int(request.path.split('/')[-1])

如果有更好的方法,我会感谢所有的建议

【问题讨论】:

  • 您是否为此视图定义了任何 urlpatterns?
  • @IvanStarostin 我有这个:path('ListDetails/', views.ListDetailUpdateView.as_view(), name='listdetailupdate'),

标签: python django django-urls


【解决方案1】:

类似的东西

class ListDetailUpdateView(ListView):
    model = ShoppingItem
    template_name = 'xlist_app/ListDetailUpdateView.html'
    context_object_name = 'products'

    def get_queryset(self):
       return ShoppingItem.objects.filter(list=self.request.resolver_match.kwargs['pk'])

【讨论】:

    【解决方案2】:

    覆盖get_queryset 方法是一种方法。

    调用super() 获取父方法返回的查询集。对其进行过滤应该可以正常工作。 与 url 模式匹配的 pk 将在 self.kwargs 中可用。

    class ListDetailUpdateView(ListView):
        model = ShoppingItem
        template_name = 'xlist_app/ListDetailUpdateView.html'
        context_object_name = 'products'
    
        def get_queryset(self):
            qs = super(ListDetailUpdateView, self).get_queryset()
            return qs.filter(list=self.kwargs.get('pk'))
    

    我还考虑将 list 字段名称更改为 shopping_list 或类似名称,因为它会影响 built-in list() 函数。

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多