使用动态form_class的Updateview

时间:2014-04-09 14:14:03

标签: python django django-views

我想在Django 1.6中动态更改form_class CBV的UpdateView

我尝试使用get_context_data()执行此操作,但由于表单已初始化,因此无效。所以它需要在__init__期间发生,我猜。 以下是我在__init__上尝试过的内容:

class UpdatePersonView(generic.UpdateView):

    model = Person
    form_class = ""

    def __init__(self, *args, **kwargs):
        super(UpdatePersonView, self).__init__(*args, **kwargs)
        person = Person.objects.get(id=self.get_object().id)
        if not person.somefield:
            self.form_class = OneFormClass
        elif person.somefield:
            self.form_class = SomeOtherFormClass

执行'UpdatePersonView' object has no attribute 'kwargs'时,我遇到person = Person.objects.get(id=self.get_object().id)错误消息。

手动指定ID时(例如id=9),设置即可生效。

如何在我强调的 init 方法中获取args / kwargs?特别是我需要访问pk

1 个答案:

答案 0 :(得分:5)

您应该简单地覆盖get_form_class

(另外我不确定你为什么要查询person:该对象已经是self.get_object()已经存在,所以没有必要再获取该ID,然后再次查询。)< / p>

def get_form_class(self):
    if self.object.somefield:
        return OneFormClass
    else:
        return SomeOtherFormClass