我有这个观点:
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
方法中对其进行操作,因为我收到了一个我需要强制进入日期时间的字符串。但是,为什么不在那里呢?
答案 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
并返回日期时间。