首页 > 解决方案 > 有没有办法将类似结构的视图功能组合成一个?姜戈

问题描述

我是 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)

所以,我只是在想是否有更优雅的方式来表示上述函数定义。我正在寻找基于类的视图吗?

标签: pythondjango

解决方案


您可以重构逻辑,以便函数处理通用逻辑,或者您可以使用基于类的视图。

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'

在这种情况下,您需要更改模板,因为模板上下文会略有不同。


推荐阅读