Django 是最受欢迎的 Web 开发框架之一。它之所以如此受欢迎,是因为它提供了许多内置功能,可以节省开发人员大量的时间。如果你是初学者,可能需要一些时间来理解项目的工作流程。但一旦积累了一些经验,你就可以轻松理解这些功能的执行方式。

Django 基于MVT(模型-视图-模板)模式,这意味着我们主要使用两种类型的视图:函数视图和类视图。如果你是初学者,你可能已经了解了函数视图(FBV)。

当Django首次发布时,它仅支持函数视图,但后来 Django 添加了类视图的概念。类视图减少了代码的冗余,同时支持了 Django 的DRY(不要重复自己)概念。

在本教程中,我们将深入了解FBV和CBV之间的区别。我们可以使用函数视图和类视图执行相同的任务,但两种方法有所不同。

Django 视图的要求

以下是关于 Django 视图的一些要点。

  • 视图的第一个位置参数应为
  • 视图应返回HttpResponse对象,或引发异常。
  • Django 视图可调用。我们可以同时使用函数视图或类视图。使用CBV时,我们继承了as_view()方法,该方法使用dispatch()方法来调用适用于HTTP请求的方法。

让我们详细解释如何创建视图的方式。

函数视图

函数视图易于使用,初学者可以轻松理解它们。它有助于理解 Django 基础概念。FBV使我们能够从头开始理解 Django 的概念。

Django 项目通常涉及CRUD操作,因此我们需要多次为相同的操作实现相同的代码,这是没有必要的,这就是 Django 类视图应运而生的原因。类视图是为了解决代码冗余问题而创建的。让我们了解FBV的以下优缺点。

函数视图的优势

FBV的优势如下。

  • 易于实现、阅读和理解
  • 明确的代码流程
  • 可以轻松实现装饰器
  • 适用于一次性或专业化功能
  • 有助于理解 Django 的核心概念。

函数视图的劣势

FBV的劣势如下。

  • 代码冗余是FBV的最大问题。
  • 将使用条件分支来处理HTTP请求。
  • 难以扩展代码。

让我们了解FBV的实现方式。

代码

def  create_view(request, pk):  
    template_name = 'form.html'  
    form_class = MyForm  
  
    form = form_class  
  
    if request.method == 'POST':  
    form = form_class(request.POST)  
    if form.is_valid():  
      form.save()  
      return HttpResponseRedirect(reverse('list-view'))  
  
    return render(request, template_name, {'form': form})  

类视图

类视图是在Python中创建视图的先进方式。它以Python对象的形式实现,而不是函数。它并不是FBV的替代品,但它们在函数视图的基础上提供了一些优势。它减少了代码的重复,并处理了基本操作,如删除和添加项。

对于初学者来说,理解类视图的概念可能稍微困难。你应该阅读文档,并进行适当的学习。如果你已经对函数视图有清晰的了解,那么你可以转向类视图。

让我们了解Python视图的以下优缺点。

类视图的优势

以下是类视图的优势。

  • CBV的最大优势之一是继承。CBV允许我们继承另一个类,并可以根据不同的用例进行修改。
  • 它支持DRY原则。它防止了代码的重复使用。在类视图中可以实现代码重用。
  • 它带有内置的通用类视图。
  • 类视图提供了适当的代码结构。我们可以使用不同的类实例方法(而不是函数视图中的条件分支语句)来生成HTTP请求。

类视图的劣势

以下是类视图的劣势。

  • 难以理解,复杂实现。
  • 隐式代码流程。
  • 视图装饰器中需要额外的导入或方法覆盖。

让我们看一下类视图的实现。

class MyCreateView(View):  
    template_name = 'form.html'  
    form_class = MyForm  
    
    def get(self, request, *args, **kwargs):  
        form = self.form_class  
            return render(request, template_name, {'form': form})  
    
     def post(self, request, *args, **kwargs):  
            form = self.form_class(request.POST)  
         if form.is_valid():  
                form.save()  
            return HttpResonseRedirect(reverse('list-view'))  
            else:  
        return render(request, self.template_name, {'form': form})  

我们调用as_view()方法来为用户提供请求。as_view()方法调用dispatch()方法,以确定根据HTTP请求需要执行哪个类方法。我们可以按照以下方式实现它。

urlpatterns = [  
    url(new/', MyCreateView.as_view(), name='original-create-view'),  
    url(new_two/', MyCreateView.as_view(), name='modified-create-view')  
    ]  

当使用Django的通用类视图时,我们可以覆盖一些辅助方法,如get_form_classget_template_names。我们还可以在这些点上添加一些自定义逻辑,而不仅仅覆盖类属性。

ModelFormMixin是最佳示例之一。form_valid方法被重写,使用了存储在self.object中的更新值。

Django 通用类视图

借助通用类视图,我们可以执行一些重要任务,例如创建新对象、列表视图、分页、表单处理、归档视图、删除视图等。

通过导入django.views.generic,我们可以实现这一点。通用类视图是执行一些基本任务的绝佳方式。它加快了开发过程。

Django提供了一组混合类和通用类视图。借助这些工具,我们可以解决Web开发中最常见的任务。

它使我们不必一遍又一遍地编写相同的代码。在下面的示例中,我们可以修改MyCreateView以继承自django.views.generic.CreateView

from django.views.generic import CreateView  
class FirstCreateView(CreateView):  
    model = MyModel  
    form_class = MyForm  

正如我们所看到的,与之前的视图相比,这需要的代码要少得多。django.views.generic.CreateView提供了许多内置功能和快捷方式。让我们讨论一些更多的细节。

默认情况下,模板应位于/<modelname>/<modelname>_form.html。我们可以通过设置类属性template_nametemplate_name_sufix来修改它。

  • 在CreateView类中,我们需要指定模型名称和form_class属性。
  • 我们还需要指定成功提交表单后将重定向到的页面。可以使用get_absoute_url()来完成。

我们可以在视图上指定字段的类属性。以下是表单字段的示例。

from django import forms  
from . models import MyModel  
class MyModelForm(forms.ModelForm):  
class Meta:  
    model = MyModel  
    fields = ['name', 'description']  

结论

开发人员之间存在热烈的争论,即使用哪种视图更好,是类视图还是函数视图?我们已经讨论了这两种视图类型的用途、优势和劣势。完全取决于项目需求和个人舒适度。在某些情况下,类视图表现良好,在某些情况下,函数视图更合适。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程