У меня есть форма, доступная из универсального обновления UpdateView. Он проверяет, среди прочего, что обновляемое событие не относится к той же дате, что и другое.Django form sporadic validation
Проблема при обновлении некоторых полей, например. местоположение, изменения обрабатываются без возникновения ошибки, но обновляются другие, например. name, вызывает ошибки проверки, связанные с датой события, с другим событием, ошибки, которые также должны возникать при редактировании местоположения.
Почему редактирование некоторых полей вызывает ошибки проверки и не редактирует другие поля? В действительности проверка должна проверять их все.
Мое мнение:
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