首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将混入与Django窗体类一起使用

将混入与Django窗体类一起使用
EN

Stack Overflow用户
提问于 2011-08-19 06:05:23
回答 3查看 11.1K关注 0票数 28

我正在考虑创建一个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>}

这是不是做不到的事情?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-20 15:46:19

问题是你的NoteFormMixin是从object而不是forms.Form派生的。您需要将其更改为:

class NoteFormMixin(forms.Form):
    note = forms.CharField()
票数 32
EN

Stack Overflow用户

发布于 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)
票数 3
EN

Stack Overflow用户

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7114710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档