0
我有一個從基於類的通用UpdateView訪問的表單。除此之外,它驗證了正在更新的事件與另一個日期不同。Django形式零星驗證
問題是,當更新一些字段時,例如位置,處理這些改變而不會引起錯誤,但是更新其他的,例如,名稱,引發關於事件日期與另一個事件衝突的驗證錯誤,這些錯誤在編輯位置時也應該發生。
爲什麼編輯某些字段會引發驗證錯誤而不編輯其他字段?真的驗證應該檢查他們。
我的觀點:
class EventEditView(UpdateView):
template_name = "edit_event.html"
pk_url_kwarg='event_id'
model = Event
form_class = EventEditForm
使用這種形式:
class EventEditForm(forms.ModelForm):
class Meta:
model = Event
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(EventEditForm, self).__init__(*args, **kwargs)
name = forms.CharField(max_length=1024,
initial="Give short, descriptive name")
location = forms.CharField(max_length=1024,
initial="Be specific, give online map link")
dateTimeOptions = {
'format': 'dd/mm/yyyy HH:ii P',
'autoclose': 'true',
'showMeridian': 'true',
}
date = forms.DateTimeField(label="Date and time",
widget=DateTimeWidget(options=dateTimeOptions,
attrs={'id':"date-time"}))
host_act = forms.CharField(max_length=1024,
initial="What act will you bring, if any?", required=False)
description = forms.CharField(required=False, max_length=10240)
def clean_location(self):
cd = self.cleaned_data
location = cd.get('location')
if location == "Be specific, give online map link" or '':
raise forms.ValidationError("Please enter a location")
return location
def clean_name(self):
cd = self.cleaned_data
name = cd.get('name')
other_names = Event.objects.proposed(datetime.now)
if name == "Give short, descriptive name" or '':
raise forms.ValidationError("Please enter a name")
return name
def clean(self):
"""
Check that there is not another event on at
the same time and place. Then check that user has not committed
to another event on the same date, even somewhere else.
"""
cleaned_data = super(EventEditForm, self).clean()
event_start_estimate = cleaned_data.get("date") - timedelta(hours=3)
event_end_estimate = event_start_estimate + timedelta(hours=7)
location = cleaned_data.get("location")
events_on_date = Event.objects.\
filter(date__range=[event_start_estimate,event_end_estimate])
events_at_location_on_date = events_on_date.filter(location=location)
# Check event clash is not this event clashing with itself
# events_with_same_date_and_location_id = events_at_location_on_date.values()[0]['id']
# this_event_id = self.instance.id
try:
if events_with_same_date_and_location_id == this_event_id:
events_at_location_on_date = False
except:
pass
if events_at_location_on_date:
raise forms.ValidationError("There is already an event on \
this date.")
user = self.request
print user
events_on_date_user_has_commit = events_on_date.filter(host__exact=user)
if events_on_date_user_has_commit:
raise forms.ValidationError("You are already committed to an event\
on this date.")
return cleaned_data