Estoy reescribiendo mi función en vistas basadas en clases, esta es la función que tengo actualmente.

@login_required
def invoice(request, invoice_no, template_name="invoice.html"):
    context = {}
    invoice_exists = Invoice.objects.filter(invoice_no=invoice_no)
    if invoice_exists:
        context['invoice'] = invoice_exists.first()
    else:
        return HttpResponseRedirect(reverse('invoices'))

    return render(request, template_name, context)

Debe iniciar sesión, se filtra utilizando un filtro llamado invoice_no

path('invoice/<int:invoice_no>', views.InvoiceView.as_view(), name="invoice"),

Y si se encuentra una coincidencia, la devuelve, de lo contrario, lo redirige a la página de facturas.

Esto es lo que tengo como clase

class InvoiceView(DetailView):
    queryset = Invoice.objects.all()
    context_object_name = 'invoice'
    pk_url_kwarg = 'invoice_no'
    template_name = "invoice.html"

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get_object(self):
        obj = super().get_object()
        return obj

También el objeto get o 404 también funcionará, ya que todo lo que necesita es una página 404 y funcionará.

0
Samuel M. 7 feb. 2020 a las 11:49

2 respuestas

La mejor respuesta

Prueba esto:

class ArticleDetailView(LoginRequiredMixin, DetailView):
    template_name = "invoice.html"
    context_object_name = 'invoice'
    model = Invoice

    def dispatch(self, request, *args, **kwargs):
        try:
            return super().dispatch(request, *args, **kwargs)
        except Invoice.DoesNotExist:
            return HttpResponseRedirect(reverse('invoices'))

    def get_object(self):
        return Invoice.objects.get(invoice_no=self.kwargs['invoice_no'])
1
Fomalhaut 7 feb. 2020 a las 12:45

Ajuste de acuerdo a su código.

from django.contrib.auth.mixins import LoginRequiredMixin

class InvoiceView(LoginRequiredMixin, DetailView):
    template_name = "invoice.html"
    context_object_name = 'invoice'

    def get_queryset(self, *args, **kwargs):
        invoice = get_object_or_404(Invoice, invoice_no=kwargs['invoice_no'])
        return invoice

Sin embargo, esto devolverá una página 404 si no se encuentran datos, si desea que redirija a la página de facturas, use un filtro. Luego use una instrucción IF para comparar la longitud> 0, si es 0, simplemente redirija a la página. También podría poner un mensaje de error también.

0
Steven 7 feb. 2020 a las 09:53