django - Django 基于类的视图返回视图或重定向到另一个页面
问题描述
我正在将我的函数重写为基于类的视图,这是我目前拥有的函数。
@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
获取对象或 404 也可以,因为它所需要的只是一个 404 页面,它会工作。
解决方案
试试这个:
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'])
推荐阅读
- python - 在事件循环中共享队列
- r - ggplot2 和 CSV “发明”不在我输入中的数据
- excel - Excel 单独的单元格值
- angular - ngOnChanges 不会触发更改
- laravel - 如何在laravel中通过href传递参数?
- javascript - 如何使用 CSS 和 html 在容器内动态创建和排列复选框?
- excel - 在 Excel (Powershell) 中强制打开列数据格式 = TEXT 的 CSV
- python - 如何让 Python 程序在一天中的某些时间执行某些任务?
- reactjs - 确保类型 A 扩展类型 B,该类型具有一个字段,该字段是另一个对象的值
- angular - 使用发布数据从外部 url 重定向到我的 angular 4 应用程序