2017-02-18 13 views
-1

В моем файле django forms.py я пытаюсь заменить два экземпляра повторяющегося кода проверки. Кажется, что каждая попытка, которую я делаю иметь только по одному случаю, не работает.django - как заменить повторяющийся код в форме проверки

Я не могу понять, как написать код, чтобы у меня было только одно вхождение каждого повторного кода в валидацию. Это должно быть возможно, но я не могу понять, как этого добиться.

Я надеюсь, что кто-то может помочь мне, так как это меня смущает.

Вот мой код проверки:

def clean(self): 
    cd_cdf = super(CertificationDetailsForm, self).clean() 

    # Must check the most specific cases first, then the general cases. 
    if 'certification_type' in cd_cdf and cd_cdf['certification_type'] == '': 
     self._errors['certification_type'] = self.error_class([_("This field is required.")]) 

    elif 'certification_type' in cd_cdf and cd_cdf['certification_type'] == display_types.ENTER_MY_OWN_TYPE_DESCRIPTION: 
     if 'certification_type_description' in cd_cdf and len(cd_cdf['certification_type_description'].strip()) == 0: 
      self._errors['certification_type_description'] = self.error_class([_("This field is required.")]) 

     # repeated code occurrence #1.1. 
     if 'certification_title' in cd_cdf and len(cd_cdf['certification_title'].strip()) == 0: 
      self._errors['certification_title'] = self.error_class([_("This field is required.")]) 

     # repeated code occurrence #2.1. 
     if 'certification_date' in cd_cdf and cd_cdf['certification_date'] is not None: 
      if cd_cdf['certification_date'] > date.today(): 
       self._errors['certification_date'] = self.error_class([_("Date must not be greater than today.")]) 

    elif 'certification_type' in cd_cdf and cd_cdf['certification_type'] != display_types.ENTER_MY_OWN_DETAILS: 
     # repeated code occurrence #1.2. 
     if 'certification_title' in cd_cdf and len(cd_cdf['certification_title'].strip()) == 0: 
      self._errors['certification_title'] = self.error_class([_("This field is required.")]) 

     # repeated code occurrence #2.2. 
     if 'certification_date' in cd_cdf and cd_cdf['certification_date'] is not None: 
      if cd_cdf['certification_date'] > date.today(): 
       self._errors['certification_date'] = self.error_class([_("Date must not be greater than today.")]) 

    elif 'certification_type' in cd_cdf and cd_cdf['certification_type'] == display_types.ENTER_MY_OWN_DETAILS: 
     if 'certification_description' in cd_cdf and len(cd_cdf['certification_description'].strip()) == 0: 
      self._errors['certification_description'] = self.error_class([_("This field is required.")]) 
     # remove the entered value and/or assign a default value, when the certification type only requires minimum data. 

     if 'certification_type_description' in cd_cdf and len(cd_cdf['certification_type_description'].strip()) > 0: 
      cd_cdf['certification_type_description'] = None 

     if 'certification_title' in cd_cdf and len(cd_cdf['certification_title'].strip()) > 0: 
      cd_cdf['certification_title'] = None 

     if 'certification_institution' in cd_cdf and len(cd_cdf['certification_institution'].strip()) > 0: 
      cd_cdf['certification_institution'] = None 

     if 'certification_date' in cd_cdf and cd_cdf['certification_date'] is not None: 
      cd_cdf['certification_date'] = None 

    return cd_cdf 

Вот код типа, только в случае, если:

CERTIFICATE = 1 
CERTIFICATE_LEVEL_I = 2 
CERTIFICATE_LEVEL_II = 3 
CERTIFICATE_LEVEL_III = 4 
CERTIFICATE_LEVEL_IV = 5 
STANDARD_CERTIFICATE = 6 
INTERMEDIATE_CERTIFICATE = 7 
ADVANCED_CERTIFICATE = 8 
ACADEMIC_CERTIFICATE = 9 
PROFESSIONAL_CERTIFICATE = 10 
OTHER_CERTIFICATE = 11 
ENTER_MY_OWN_TYPE_DESCRIPTION = 7777 # 7777 triggers a hidden text field to be displayed. 
ENTER_MY_OWN_DETAILS = 9999 

CERTIFICATION_TYPES = (
    (CERTIFICATE, _('Certificate')), 
    (CERTIFICATE_LEVEL_I, _('Certificate Level I')), 
    (CERTIFICATE_LEVEL_II, _('Certificate Level II')), 
    (CERTIFICATE_LEVEL_III, _('Certificate Level III')), 
    (CERTIFICATE_LEVEL_IV, _('Certificate Level IV')), 
    (STANDARD_CERTIFICATE, _('Standard Certificate')), 
    (INTERMEDIATE_CERTIFICATE, _('Intermediate Certificate')), 
    (ADVANCED_CERTIFICATE, _('Advanced Certificate')), 
    (ACADEMIC_CERTIFICATE, _('Academic Certificate')), 
    (PROFESSIONAL_CERTIFICATE, _('Professional Certificate')), 
    (OTHER_CERTIFICATE, _('Other Certificate')), 
    (ENTER_MY_OWN_TYPE_DESCRIPTION, _('Enter my own Type Description')), 
    (ENTER_MY_OWN_DETAILS, _('Enter my own details')) 
) 

ответ

0

Как это:

def clean(self): 
    cd_cdf = super(CertificationDetailsForm, self).clean() 

    ctype = 'certification_type' 
    ctypedesc = 'certification_type_description' 
    ctitle = 'certification_title' 
    cdate = 'certification_date' 
    cdesc = 'certification_description' 
    cinst = 'certification_institution' 

    # Must check the most specific cases first, then the general cases. 
    if ctype in cd_cdf: 
     if cd_cdf[ctype] == '': 
      self._errors[ctype] = self.error_class([_("This field is required.")]) 

     elif (cd_cdf[ctype] == display_types.ENTER_MY_OWN_TYPE_DESCRIPTION) or (cd_cdf[ctype] != display_types.ENTER_MY_OWN_DETAILS): 
      if cd_cdf[ctype] == display_types.ENTER_MY_OWN_TYPE_DESCRIPTION: 
       if ctypedesc in cd_cdf and len(cd_cdf[ctypedesc].strip()) == 0: 
        self._errors[ctypedesc] = self.error_class([_("This field is required.")]) 
      else: 
       if ctitle in cd_cdf and len(cd_cdf[ctitle].strip()) == 0: 
        self._errors[ctitle] = self.error_class([_("This field is required.")]) 

       if cdate in cd_cdf and cd_cdf[cdate] is not None: 
        if cd_cdf[cdate] > date.today(): 
         self._errors[cdate] = self.error_class([_("Date must not be greater than today.")]) 

     elif cd_cdf[ctype] == display_types.ENTER_MY_OWN_DETAILS: 
      if cdesc in cd_cdf and len(cd_cdf[cdesc].strip()) == 0: 
       self._errors[cdesc] = self.error_class([_("This field is required.")]) 
      # remove the entered value and/or assign a default value, when the certification type only requires minimum data. 

      forcheck = [ctypedesc, ctitle, cinst] 
      for i in forcheck: 
       if i in cd_cdf and len(cd_cdf[i].strip()) > 0: 
        cd_cdf[i] = None 

      if cdate in cd_cdf and cd_cdf[cdate] is not None: 
       cd_cdf[cdate] = None 

    return cd_cdf 

Я заменил ваши часто упомянутые строки с самоочевидными переменными и присоединившимися к второму и третьему условиям. Я не тестировал это.

Я согласен с первым ответом, он неликвиден и нерентичен, но я понятия не имею, что все эти условия, поэтому я не могу больше сократить код.

 Смежные вопросы

  • Нет связанных вопросов^_^