2014-02-06 15 views
0

我有以下形式:Django 1.5 SplitDateTimeWidget发送到form.clean()的数据是什么?

class TripForm(IntranetForm): 
    def __init__(self, *args, **kwargs): 
     super(TripForm, self).__init__(*args, **kwargs) 
     self.helper.layout = Layout(
      Field('reason', css_class='input-xlarge'), 
      Field('departure_date'), 
      Field('return_date'), 
      Field(
       'date_and_time_of_first_appointment', 
      ), 
      Field(
       'date_and_time_final_appointment_finishes', 
      ), 
      Field(
       'departure_location', 
       template='travel/related_departure.html', 
      ), 
      Field(
       'destination', 
       template='travel/related_destination.html', 
      ), 
      Field('mode_of_transport', css_class='input-xlarge'), 
      Field('seating_preference', css_class='input-xlarge'), 
      Field('special_requests', css_class='input-xlarge'), 
      FormActions(
       Submit(
        'save_changes', 
        'Save changes', 
        css_class = "btn-primary", 
       ), 
       Button(
        'cancel', 
        'Cancel', 
        onclick = 'history.go(-1);' 
       ), 
      ), 
     ) 

    def clean(self): 
     cleaned_data = super(TripForm, self).clean() 
     departure_date = cleaned_data.get("departure_date") 
     return_date = cleaned_data.get("return_date") 
     a1 = cleaned_data.get("date_and_time_of_first_appointment") 
     af = cleaned_data.get("date_and_time_final_appointment_finishes") 

     if departure_date < datetime.date.today(): 
      msg = u"Must be a date in the future." 
      self._errors["departure_date"] = self.error_class([msg]) 

      del cleaned_data["departure_date"] 

     if a1.date() < departure_date: 
      msg = u"Must be after the departure date." 
      self._errors["date_and_time_of_first_appointment"] = self.error_class([msg]) 

      del cleaned_data["date_and_time_of_first_appointment"] 

     if return_date < departure_date: 
      msg = u"Must be after the departure date." 
      self._errors["return_date"] = self.error_class([msg]) 

      del cleaned_data["return_date"] 

     if af < a1 or af.date() > return_date: 
      msg = u"Must be after the first appointment and before the return date." 
      self._errors["date_and_time_final_appointment_finishes"] = self.error_class([msg]) 

      del cleaned_data["date_and_time_final_appointment_finishes"] 

     return cleaned_data 

    class Meta: 
     model = Trip 
     fields = (
      'reason', 
      'departure_date', 
      'return_date', 
      'date_and_time_of_first_appointment', 
      'date_and_time_final_appointment_finishes', 
      'departure_location', 
      'destination', 
      'mode_of_transport', 
      'seating_preference', 
      'special_requests', 
     ) 
     widgets = { 
      'date_and_time_of_first_appointment': SplitDateTimeWidget(), 
      'date_and_time_final_appointment_finishes': SplitDateTimeWidget(), 
     } 

测试类似于下面所有的一个正常工作的时候我使用SplitDateTimeWidget

def test_trip_form_with_good_data(self): 
    form_data = { 
     'reason': 'HE', 
     'departure_date': timezone.datetime.today(), 
     'return_date': timezone.datetime.today(), 
     'date_and_time_of_first_appointment': timezone.now(), 
     'date_and_time_final_appointment_finishes': timezone.now(), 
     'departure_location': 1, 
     'destination': 1, 
     'mode_of_transport': 'TR', 
     'seating_preference': 'Near the front', 
     'special_requests': 'Make it nice', 
    } 
    form = TripForm(data=form_data) 
    self.assertTrue(form.is_valid()) 

但是,当使用的SplitDateTimeWidget是为DateTime场测试不再运行。他们把错误,而不是失败,具体如下:

AttributeError: 'NoneType' object has no attribute 'date' 

每当a1变量在我重写的形式clean方法来访问。

我已经看过相关的源代码,并且看不到为什么使用SelectDateTimeWidget会在命令行或测试中需要不同的输入,但显然它确实如此。我的测试应该如何以clean方法能够访问的方式提供数据?

编辑: 以我的线索,从所提供的HTML我也尝试让不同的日期和时间从领域,如date_and_time_of_first_appointment_0date_and_time_of_first_appointment_1和他们在clean方法,但无济于事比较之前组合。

回答

0

我解决了这个问题。呈现的html确实告诉我该怎么做,但我把我的解决方案放在了错误的地方。

而不是寻找干净的方法,这是我最初尝试的单独的领域,你需要把它们放在你的测试数据。在数据传递到clean()时,Django将会合并它们。我的测试现在看起来像这样:

def test_trip_form_with_good_data(self): 
    form_data = { 
     'reason': 'HE', 
     'departure_date': timezone.datetime.today(), 
     'return_date': timezone.datetime.today(), 
     'date_and_time_of_first_appointment_0': timezone.now().date(), 
     'date_and_time_of_first_appointment_1': timezone.now().time(), 
     'date_and_time_final_appointment_finishes_0': timezone.now().date(), 
     'date_and_time_final_appointment_finishes_1': timezone.now().time(), 
     'departure_location': 1, 
     'destination': 1, 
     'mode_of_transport': 'TR', 
     'seating_preference': 'Near the front', 
     'special_requests': 'Make it nice', 
    } 
    form = TripForm(data=form_data) 
    self.assertTrue(form.is_valid()) 

而且所有的东西都再次通过。

相关问题