【问题标题】:Django form.cleaned_data is NoneDjango form.cleaned_data 是无
【发布时间】:2013-04-03 13:00:01
【问题描述】:

这是我的表格:

class EventForm(forms.Form):
    start_date       = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'span6 as-date'}))
    end_date         = forms.CharField(required=True, widget=forms.TimeInput(attrs={'class': 'span6 as-date'}))
    title            = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'span8'}))
    description      = forms.CharField(required=True, widget=forms.Textarea(attrs={'rows': 4, 'class': 'span8'}))
    total_seats      = forms.IntegerField(required=True, widget=forms.TextInput(attrs={'class': 'span6'}))
    buffer_seats     = forms.IntegerField(required=True, widget=forms.TextInput(attrs={'class': 'span6'}))
    seat_cost        = forms.IntegerField(required=True, widget=forms.TextInput(attrs={'class': 'span8'}))
    published        = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'span6'}))
    verified_booking = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'span6'}))

def clean(self):
    try:
        self.cleaned_data['start_date'] = datetime.strptime(self.cleaned_data['start_date'], '%Y/%m/%d %H:%M')
    except ValueError:
        raise forms.ValidationError('Improper start date')
    try:
        self.cleaned_data['end_date'] = datetime.strptime(self.cleaned_data['end_date'], '%Y/%m/%d %H:%M')
    except ValueError:
        raise forms.ValidationError('Improper end date')
    if self.cleaned_data['buffer_seats'] >= self.cleaned_data['total_seats']:
        raise forms.ValidationError('Seats buffered can not be same or greater than total seats')
    if self.cleaned_data['start_date'] >= self.cleaned_data['end_date']:
        raise forms.ValidationError('Event start date can not be greater than end date')
    if self.cleaned_data['published'] == 'on':
        self.cleaned_data['published'] = True
    else:
        self.cleaned_data['published'] = False
    if self.cleaned_data['verified_booking'] == 'on':
        self.cleaned_data['verified_booking'] = True
    else:
        self.cleaned_data['verified_booking'] = False

这是视图:

event_form = EventForm(request.POST)
if event_form.is_valid():
   event = events_api.save_event_from_form(request.user, address, event_form.cleaned_data)

但我得到的event_form.cleaned_dataNone。我错过了什么?

【问题讨论】:

  • 您在 clean() 方法中忘记了 return
  • 没有错,return 不是必须的。请参阅下面的评论接受的答案。

标签: django python-2.7 django-forms


【解决方案1】:

form.clean() 必须返回cleaned_data。规范的实现是:

class MyForm(forms.Form):
    # ...
    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        # do your custom validations / transformations here
        # and some more
        return cleaned_data

【讨论】:

  • 这实际上是不正确的。它不得返回cleaned_data。该解决方案有效的原因是缺少cleaned_data = super().clean()。有趣的是直到今天才有人指出这一点。没有必要返回 cleaned_data。当您使用 clean_fieldname 清理特定字段时,就是这样。
  • @lapin:您似乎实际上是正确地返回 cleaned_data 不是严格要求 - 查看 Form._clean_form(),它只会重新绑定 self.cleaned_data 如果它不是 None 所以 OP 的实现应该确实有效。话虽这么说,由于默认的Form.clean() 实现只返回self.cleaned_data,因此您对负责解决问题的super().clean() 调用也是错误的——除非OP 的代码sn-p 不准确或不完整。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2017-05-29
  • 2018-12-07
相关资源
最近更新 更多