将django函数泛型视图转换为基于类的泛型视图

将django函数泛型视图转换为基于类的泛型视图,django,django-generic-views,django-class-based-views,Django,Django Generic Views,Django Class Based Views,我在所有模型中都添加了“用户”字段。当用户创建对象时,我希望通过外键附加他们的ID user = models.ForeignKey(User) 以前,我使用的是create_对象和update_对象。我认为我需要切换到基于类的泛型视图,以便最容易地将所需的用户插入到记录中。但在调用create_object或update_object之前,我对如何建立我以前的函数中发生的一些预计算感到困惑 我有一个函数可以处理所有对象编辑,无论是创建还是更新: @login_required def ed

我在所有模型中都添加了“用户”字段。当用户创建对象时,我希望通过外键附加他们的ID

user = models.ForeignKey(User)
以前,我使用的是create_对象和update_对象。我认为我需要切换到基于类的泛型视图,以便最容易地将所需的用户插入到记录中。但在调用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 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\u object或update\u object时所做的工作?

基于类的通用视图具有用于所需任务的方法。例如,对于创建对象的窗体,使用
CreateView
,并定义使用哪个窗体来覆盖
get\u form\u class()
方法


我强烈建议您不要试图准确地转换当前逻辑,而是花一些时间了解基于类的视图的细节,因为许多常见功能已经在那里得到了详细解决。

为什么要转换Django函数?通用视图并不那么方便。最大的缺点是继承而不是合成。更实际的做法是创建自己的基于类的视图或使用视图函数。顺便说一句,最新Django版本中不推荐使用泛型视图。您是否建议我创建一个不基于泛型基于类的视图的基于类的视图?我知道基于函数的create/update_对象已被弃用,但我认为它们正被基于泛型类的视图所取代。请原谅我的错误信息。无论如何,在使用基于类的泛型视图之前,请仔细考虑。如果您想在继承链的中间位置添加一个新类,有时会非常痛苦。如果一个类有几个子类,并且一个子类必须具有新中间类的功能,而另一个子类不能具有该功能,则需要重构。您必须在几个函数中处理公共部分。在我的实践中,它变得有点僵硬。请看那边: