将django函数通用视图转换为基于类的通用视图

时间:2012-11-02 16:19:33

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

我为所有模特添加了“用户”字段。当用户创建对象时,我想通过外键附加他们的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/'

我将如何/应该改变我的逻辑以转向使用CreateView或UpdateView与我在此处使用create_object或update_object在同一函数中所做的操作,具体取决于是否定义了slug / id?

1 个答案:

答案 0 :(得分:1)

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

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