【问题标题】:Django DetailView filter by two parameters not using the primary keyDjango DetailView 过滤两个参数不使用主键
【发布时间】:2020-02-18 00:42:34
【问题描述】:

我需要通过两个值过滤模型,它们都不是模型的 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 或 slug 调用。

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

【问题讨论】:

    标签: django django-models django-views django-urls


    【解决方案1】:

    找了好久,终于解决了:

    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)
    

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2022-01-16
      • 2019-07-10
      • 1970-01-01
      • 2012-03-13
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多