Django表示没有将值传递给cleaning_data

时间:2016-02-03 15:23:51

标签: django django-forms

我有这个观点:

def new_booking(request):

    if request.method == "POST":
        form = BookingForm(request.POST, request.FILES)
        print "form before clean: %s" % form.data  # Data is here
        if form.is_valid():
            form.save()

以及此表格:

class BookingForm(forms.ModelForm):

    def clean(self):
        print "form data in clean method: %s" % self.cleaned_data
        hora = self.cleaned_data['hora']  # !!! KeyError
        print hora

    class Meta:
        model = Booking
        fields = ['hora', 'nombre', 'email', 'archivo']
        widgets = {
            'nombre': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'archivo': forms.FileInput(attrs={}),
            'hora': forms.TextInput(attrs={'class': 'form-control date', 'id': 'booking_time', 'readonly': 'readonly'})
        }

所以..第一个印刷品(视图中的印刷品)给了我这个:

form before clean: <QueryDict: {u'hora': [u'Jueves 4 de Febrero a las 9:00 am '], u'nombre': [u'Alejandro'], u'csrfmiddlewaretoken': [u'**********'], u'email': [u'alejo@gmail.com']}>

第二个印刷品,clean方法中的那个,给我这个:

form data in clean method: {'nombre': u'Alejandro', 'email': u'alejo@gmail.com', 'archivo': <InMemoryUploadedFile: SO_username_admin_upZnsyk.png (image/png)>}

正如您所看到的,由于某些原因我不明白,hora kwarg已经从数据字典中消失了:它没有出现在self.cleaned_data中。

额外信息:我需要在clean方法中对其进行操作,因为我收到了一个我需要强制进入日期时间的字符串。但是,为什么不在那里呢?

3 个答案:

答案 0 :(得分:1)

首先需要调用基类clean方法来获取cleaning_data:

def clean(self):
    cleaned_data = super(BookingForm, self).clean()
    print "form data in clean method: %s" % cleaned_data
    hora = self.cleaned_data['hora']
    print hora

Django doc example of clean method

答案 1 :(得分:1)

你宣布&#39; hora&#39;在您的表单中为TimeInput,但您在request.POST中收到的值是一个字符串,不仅包含时间,还包含日期。出于这个原因,该值无效,并且&#39; hora&#39;调用form.cleaned_data方法时未在clean()中设置。我猜form.is_valid()返回false。

答案 2 :(得分:0)

好的,解决方案是明确声明字段:

class BookingForm(forms.ModelForm):

    hora = forms.CharField(max_length=150, required=True,
                           widget=forms.TextInput(attrs={'class': 'form-control date', 'id': 'booking_time', 'readonly': 'readonly'}))  #HERE


    def clean_hora(self):            

        hora = self.cleaned_data['hora']

        return process_time_string(hora)


    class Meta:
        model = Booking
        fields = ['hora', 'nombre', 'email', 'archivo']
        widgets = {
            'nombre': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'archivo': forms.FileInput(attrs={}),
            'hora': forms.TextInput(attrs={'class': 'form-control date', 'id': 'booking_time', 'readonly': 'readonly'})
        }

然后,我可以在self.cleaned_data['hora']中接收数据,并在@LostMyGlasses建议的函数clean_hora中处理它。函数process_time_string只获取字符串,调用strptime并返回日期时间。