2013-09-24 119 views
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  

回答

0

你在你的代碼的一些錯誤,這可能或可能不會與您問題相關。

您的if語句clean_location將始終爲假,因爲''爲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 

也許這些變化將解決您的問題。