我想在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
。
答案 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