如何根据当前URL中的ID筛选ListView输出

2024-10-01 02:38:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目是一份购物清单。我有两个模型: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)

url.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中的函数(其中“XXXX”)

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

在我看来应该是这样的:

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

如果有更好的方法,我会考虑所有的建议


Tags: pathnamepyfalseurlmodelsshoppinglistnull
2条回答

诸如此类

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'])

重写get_queryset方法是一种方法

调用super()获取父方法返回的查询集。对它进行过滤应该可以正常工作。 ^由url模式匹配的{}将在{}中提供

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'))

我也会考虑将^ {< CD5>}字段名改为^ {CD6>}或类似,因为它隐藏built-in^ {CD7>}函数。

相关问题 更多 >