1

既存のフォームを拡張して、送信時にメールが送信されるようにしたい:

class BaseForm(forms.Form):

    field = forms.CharField()

    def clean(self):
        "do stuff"
        return self.cleaned_data

class MyForm(BaseForm):

    def clean_field(self):
        "do some validation"
        return self.cleaned_data['field']

class MyEmailingForm(MyForm):
    def clean(self):
        super(MyEmailingForm, self).clean()
        send_mail('Form data',
          self.cleaned_data['field'],
          'Form <noreply@myform.co.uk>',
          ["formdata@myform.co.uk"],
          fail_silently=True)

問題はself.cleaned_data['field']、スーパークラスからアクセスできないことですKeyError。. 私は何をする必要がありますか?

編集

私は物事を単純化しすぎたと思います。コードが更新されました。問題は二重サブクラス化である可能性があります。

4

4 に答える 4

1

self.cleaned_data基本メソッドとサブクラス メソッドの両方から戻る必要があります。

于 2013-03-11T11:56:34.613 に答える
1

self.cleaned_data を基本クラスに戻すだけで機能すると思います。

class MyForm(forms.Form):
    field = forms.CharField()

    def clean(self):
        "do stuff"
        return self.cleaned_data

    class MyEmailingForm(MyForm):
        def clean(self):
            super(MyEmailingForm, self).clean()
            send_mail('Form data',
              self.cleaned_data['field'],
              'Form <noreply@myform.co.uk>',
              ["formdata@myform.co.uk"],
              fail_silently=True)
              return self.cleaned_data
于 2013-03-11T12:14:52.873 に答える
0

is_valid()最初にメソッドを使用する必要があります。

https://docs.djangoproject.com/en/dev/topics/forms/

于 2013-03-11T12:00:20.320 に答える
0

実際self.cleaned_data['field']に base で設定しているフィールドは には含まれていませんcleaned_data

試す

class MyForm(forms.Form):
    field = forms.CharField()

    def clean(self):
        cd = self.cleaned_data
        "do stuff with cd"
        return cd
于 2013-03-11T12:09:35.093 に答える