Django DetailView通过不使用主键的两个参数进行过滤

问题描述 投票:0回答:1

我需要通过两个值来过滤模型,这两个值都不是模型的PK。

我想过滤特定汽车和某周的付款,这意味着我一个星期内可以有多于一辆汽车的付款。

我正在使用Django-Tables2显示结果。

views.py

class PagosDetailView(SingleTableMixin, DetailView):

    template_name = "AC/paymentsbycarandweek.html"
    context_table_name = 'table'
    model = Pagos
    table_class = PagosTable
    slug_url_kwarg = 'carro_id'

    def get_queryset(self):
        qs = super(PagosDetailView, self).get_queryset()
        return qs.filter(carro=self.kwargs['carro'], semana=self.kwargs['semana'])

models.py

class Pagos(models.Model):

    carro = models.ForeignKey(
        Carros, on_delete=models.CASCADE, blank=False, null=False)
    pago = models.DecimalField(max_digits=6, decimal_places=2)
    fecha = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True)
    semana = models.CharField(max_length=20)
    startweek = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True)
    endweek = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True)
    renta = models.ForeignKey(
        Renta, on_delete=models.PROTECT, blank=False, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "Pagos"

    def get_absolute_url(self):
        return reverse('pagos')

    def __str__(self):
        return self.semana

urls.py

path('paymentsbycarandweek/<int:carro>/<slug:semana>',
         views.PagosDetailView.as_view(), name='pagos_bycar')

这是我最后一次尝试了几种选择,但出现以下错误消息:

通用详细视图PagosDetailView必须使用URLconf中的对象pk或子弹调用。

我究竟如何传递这两个参数?

django django-models django-views django-urls
1个回答
0
投票

经过大量搜索之后,这就是我终于解决的方法:

class PagosDetailView(SingleTableMixin, ListView):

    model = Pagos
    table_class = PagosDetailTable
    template_name = 'AC/paymentsbycarandweek.html'
    paginate_by = 10

    def get(self, request, *args, **kwargs):
        self.object_list = self.get_queryset()
        self.object_list = self.object_list.filter(
            carro=kwargs['carro'], semana=kwargs['semana'])

        context = self.get_context_data()
    return self.render_to_response(context)
© www.soinside.com 2019 - 2024. All rights reserved.