Django Представление на основе классов возвращает представление или перенаправляет на другую страницу - PullRequest
0 голосов
/ 07 февраля 2020

Я переписываю свою функцию в представления на основе классов, эта функция у меня есть в настоящее время.

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

Вы должны войти в систему, она фильтруется с использованием фильтра с именем invoice_no

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

и, если найдено совпадение, возвращает его, если нет, перенаправляет вас обратно на страницу счетов.

это то, что у меня как класса

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

также get object или 404 тоже подойдут, так как все, что нужно, это страница 404, и она будет работать.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Попробуйте это:

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'])
0 голосов
/ 07 февраля 2020

Настройте в соответствии с вашим кодом.

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

Это, однако, вернет страницу 404, если данные не найдены, если вы хотите перенаправить их на страницу счетов, используйте фильтр. Затем используйте оператор IF для сравнения длины> 0, если 0, то просто перенаправьте на страницу. Тогда тоже можно поставить сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...