UpdateView和CreateView共享常见的JavaScript功能



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

最新更新