我有一个从基于类的通用UpdateView访问的表单。除其他事项外,它验证正在更新的事件与另一个事件的日期不同。
问题是,在更新某些字段时,例如位置,处理更改时不会引发错误,但更新其他更改,例如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
答案 0 :(得分:0)
您的代码中有一些错误,可能与您的问题有关,也可能没有。
clean_location
中的if语句将始终为false,因为''
为false。我想你想要的是:
if name in ["Give short, descriptive name", '']:
其次,在clean_name
中也是如此。应该是:
if name in ["Give short, descriptive name", '']:
第三,在clean
中,您使用self.request
作为用户对象:
user = self.request
应该是:
user = self.request.user
也许这些更改可以解决您的问题。