2013-09-24 3 views
0

У меня есть форма, доступная из универсального обновления 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  

ответ

0

У вас есть в вашем коде несколько ошибок, которые могут или не могут быть связаны с вашей проблемой.

Ваш оператор if в clean_location всегда будет ложным, потому что '' является ложным. Я думаю, что вы хотите это:

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 

Может быть, эти изменения будут решить вашу проблему.