django 1.9.7
更新和创建或多或少是相似的操作。有时,我想将JavaScript事件添加为小部件attrs。例如,用户选择性别。根据我想显示或隐藏少女名称的不同。这只是updateView和createview的某些操作的一个示例。
我试图将其作为Mixin组织,但失败了:UpdateView和CreateView都使用FormMixin。如果我组织了另一种从formmixin继承的混合物,我会得到一场冲突。
您能帮我了解如何在不重复代码的情况下应对吗?
class PersonUpdateView(UpdateView):
model = Person
fields = ['gender', 'last_name']
class PersonCreate(CreateView):
model = Person
fields = ['gender', 'last_name']
redirect_name = "people"
field_attrs = {'gender': {'onchange':"alert('G')"},
'last_name': {'onclick': "alert('LN')"},
}
def get_form(self, form_class=None):
form = super(PersonCreate, self).get_form(form_class)
for key, value in self.field_attrs.items():
form.fields[key].widget.attrs = value;
return form
您的混音应该是一个简单的类:
class CreateUpdateMixin(object):
model = Person
fields = ['gender', 'last_name']
field_attrs = {'gender': {'onchange':"alert('G')"},
'last_name': {'onclick': "alert('LN')"},
}
然后您像这样使用:
class PersonUpdateView(CreateUpdateMixin, UpdateView):
pass
class PersonCreate(CreateUpdateMixin, CreateView):
redirect_name = "people"
def get_form(self, form_class=None):
form = super(PersonCreate, self).get_form(form_class)
for key, value in self.field_attrs.items():
form.fields[key].widget.attrs = value;
return form