【问题标题】:Convert django function generic view into class-based generic view将 django 函数通用视图转换为基于类的通用视图
【发布时间】:2012-10-23 08:16:30
【问题描述】:

我为我的所有模型添加了一个“用户”字段。当用户创建对象时,我想通过外键附加他们的 ID

user = models.ForeignKey(User)

以前,我使用的是 create_object 和 update_object。我相信我需要切换到基于类的通用视图,以便最轻松地将所需的用户插入到记录中。但我对如何在调用 create_object 或 update_object 之前在我之前的函数中进行一些预先计算感到困惑。

我有一个函数可以处理所有对象编辑,无论是创建还是更新:

@login_required 
def edit_item(request, modelname, submodelname=None, slug=None, id=None):
    # Get parameter "next" to determine where to send user after object is created or updated

    # Define which template to use

    # Determine whether user is converting an object to another type

    # Determine which form_class to use based on modelname and whether user is converting or not

    # Redirect user if slug and id are not both correct

    # Abort if user hit cancel instead of submit

    # If object exists (slug and id are defined):
        # Update_object with form_class, object_id, template_name, post_save_redirect, and extra_context
    # Else
        # Create_object with form_class, template_name, post_save_redirect, and extra_context

在基于类的通用视图中,我如何/在何处/何时执行其中一些计算(围绕基于标准定义模板或 form_class 的逻辑)?我很困惑,因为文档似乎直接进入了定义:

class ContactView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = '/thanks/'

我可以把逻辑扔在那里吗?

class ContactView(FormView):
    A = 1 + 2
    if A == 3:
        template_name = 'contact.html'
    else:
        template_name = 'contact_two.html'
    form_class = ContactForm
    success_url = '/thanks/'

根据是否定义了 slug/id,我将/应该如何改变我的逻辑以转移到使用 CreateView 或 UpdateView 与我在这里在同一函数中使用 create_object 或 update_object 所做的事情?

【问题讨论】:

  • 为什么要转换 Django 函数?通用视图不是那么方便。最大的缺点是继承而不是组合。创建自己的基于类的视图或使用视图函数更实用。 BTW 通用视图在最新的 Django 版本中已被弃用。
  • 您是否建议我创建一个基于类的视图,而不是基于通用的基于类的视图?我知道基于函数的 create/update_object 已被弃用,但我认为它们正在被基于类的通用视图所取代。
  • 请原谅我的虚假信息。无论如何,在使用基于类的通用视图之前要考虑清楚。如果您想在继承链的中间位置添加一个新类,有时会很痛苦。如果一个类有几个孩子,一个孩子必须具有新中间类的特性,而另一个孩子不能具有该特性,则需要重构。您必须处理多个功能中的公共部分。在我的实践中,它变得有点不灵活。请看那边:dpaste.com/hold/823122

标签: django django-generic-views django-class-based-views


【解决方案1】:

基于类的通用视图具有用于您需要的任务的方法。例如,对于创建对象的表单,您使用CreateView,并定义使用哪个表单覆盖get_form_class() 方法。

我强烈建议您不要尝试完全转换您当前的逻辑,而是花一些时间来了解基于类的视图的详细信息,因为那里已经详细解决了许多常见功能。

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2011-11-19
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多