python - 有没有办法将类似结构的视图功能组合成一个?姜戈
问题描述
我是 Django 的初学者。最近,我开始编写一个用于库存管理的 Web 应用程序,我意识到当我编写视图时,其中有很多具有相似结构的视图。例如:
def invoices(request):
"""The page for displaying invoices."""
invoice_list = Document.objects.filter(type_name__name='Invoice')
page = request.GET.get('page', 1)
paginator = Paginator(invoice_list, 10)
try:
invoices = paginator.page(page)
except PageNotAnInteger:
invoices = paginator.page(1)
except EmptyPage:
invoices = paginator.page(paginator.num_pages)
context = {'invoices':invoices}
return render(request, 'imsapp/invoices.html', context)
和这个:
def credit_notes(request):
"""The page for displaying credit notes."""
credit_notes_list = Document.objects.filter(type_name__name='Credit Note')
page = request.GET.get('page', 1)
paginator = Paginator(credit_notes_list, 10)
try:
credit_notes = paginator.page(page)
except PageNotAnInteger:
credit_notes = paginator.page(1)
except EmptyPage:
credit_notes = paginator.page(paginator.num_pages)
context = {'credit_notes':credit_notes}
return render(request, 'imsapp/credit_notes.html', context)
所以,我只是在想是否有更优雅的方式来表示上述函数定义。我正在寻找基于类的视图吗?
解决方案
您可以重构逻辑,以便函数处理通用逻辑,或者您可以使用基于类的视图。
def paginate(request, queryset):
page_index = request.GET.get('page', 1)
paginator = Paginator(queryset, 10)
try:
page = paginator.page(page_index)
except PageNotAnInteger:
page = paginator.page(1)
except EmptyPage:
page = paginator.page(paginator.num_pages)
return page
def credit_notes(request):
"""The page for displaying credit notes."""
credit_notes_list = Document.objects.filter(type_name__name='Credit Note')
credit_notes = paginate(request, credit_notes_list)
context = {'credit_notes':credit_notes}
return render(request, 'imsapp/credit_notes.html', context)
或者你可以使用 ListView
from django.views.generic.list import ListView
class CreditNoteListView(ListView):
queryset = Document.objects.filter(type_name__name='Credit Note')
paginate_by = 10
template_name = 'imsapp/credit_notes.html'
在这种情况下,您需要更改模板,因为模板上下文会略有不同。
推荐阅读
- security - Terraform:您如何检查敏感数据?
- excel - VBA - 多个范围的 Excel 到 powerpoint 崩溃
- c# - 尝试将充满 1 和 0(二进制)的数组转换为字符串,然后在 Unity 中转换为 int
- dialog - 如何根据数组中的项目显示 Vuetify 对话框内容
- google-chrome - IONIC 5:仅在手机的 chrome 浏览器中打开外部 URL
- python - 如何将 NoneType nltk.collocations() 转换为 Pyhton 中的列表或字符串?
- azure-app-service-plans - 并置服务的应用服务扩展
- reactjs - 命令 yarn run build 抛出错误
- ubuntu - 如果 ping 故障转移监控,如何运行命令?
- angular - SignalR + Nginx + 2 Angular Apps 在“某些”集线器上引发 405 错误