我正在考虑创建一个mixin form类,这样我就可以将一组公共字段添加到各种不同的表单中。仅仅使用它作为基类是行不通的,因为我希望能够使用其他形式作为基类,比如:
class NoteFormMixin(object):
note = forms.CharField()
class MainForm(forms.Form):
name = forms.CharField()
age = forms.IntegerField()
class SpecialForm(MainForm, NoteFormMixin):
favorite_color = forms.CharField()
我唯一的问题是:这是如何工作的?到目前为止,如果我使用了一个混合,那么它就不能识别从那个混合中设置的字段:
>>> ff1 = SpecialForm()
>>> ff1.fields
{'name': <django.forms.fields.CharField object at 0x178d3110>, 'age': <django.forms.fields.IntegerField object at 0x178d3190>, 'favorite_color': <django.forms.fields.CharField object at 0x178d3210>}
这是不是做不到的事情?
发布于 2011-08-20 15:46:19
问题是你的NoteFormMixin是从object而不是forms.Form派生的。您需要将其更改为:
class NoteFormMixin(forms.Form):
note = forms.CharField()
发布于 2015-03-15 02:13:20
class TextFormMixin(object):
def __init__(self, *args, **kwargs):
super(TextFormMixin, self).__init__(*args, **kwargs)
self.fields['text'] = forms.CharField(widget=forms.Textarea, required=True)
def clean_text(self):
if not ('{{EMAIL}}' in self.cleaned_data.get('text', '')):
raise ValidationError("You have to put {{EMAIL}} in message body.")
return self.cleaned_data.get('text', '')
def get_text(self):
return self.cleaned_dat['text'].replace('{{EMAIL}}', self.case.get_email())
class NewCaseForm(TextFormMixin, forms.ModelForm):
pass
class ReplyForm(TextFormMixin, forms.Form):
to = forms.CharField(max_length=50)
subject = forms.CharField(max_length=50)
发布于 2020-02-08 01:56:49
我只是想澄清@Adam Dobrawy的答案,这对我很有帮助:
这不起作用:
class NoteFormMixin(object):
note = forms.CharField()
这样做:
class NoteFormMixin(object):
def __init__(self, *args, **kwargs):
super(NoteFormMixin, self).__init__(*args, **kwargs)
self.fields['note'] = forms.CharField()
这种行为可能与django在类实例化期间收集字段的方式有关。我没有费心去讨论它的杂草。我发现这个花边新闻可以让我以一种很好的可读性的方式编写我的混合代码,而不需要任何额外的特定于django form的crud。
https://stackoverflow.com/questions/7114710
复制相似问题