•  
  • 3
  •  
1

Обязательные поля в Django

Имеется объект, приблизительно такого содержания:

class Object(models.Model):
  first = models.TextField(blank = True)  
  second = models.TextField(blank = True)  
  isType = models.BooleanField(default = True)

  def save(self):
    if not self.first && not self.second:
      print 'ERROR'
    else:
      if not self.second:
        self.isType = False
      self.super()

Хотя бы одно из текстовых поле должно быть заполненным (то есть возможны варианты, когда только поле first непустое, только second не пустое или оба поля одновременно заполнены), при этом если пустует поле second, то isType меняет значение на False.

А теперь сам вопрос. Реально ли без создания древ if/else в def save() требовать, чтобы хотя бы одно из двух полей было заполнено?

python, django, models.
спросил 866 дней назад Аватор пользователя zemlanin zemlanin
62 3
300

2 ответа:

    •  
    • 2
    •  

    Достаточно простая логика, без всяких ифов решаемая так:

    class TestModel(models.Model):
        first = models.TextField(blank=True, null=True)  
        second = models.TextField(blank=True, null=True)  
        is_type = models.BooleanField(default=True, editable=False)
    
        def save(self):
            self.is_type = self.first or self.second
    

    Неправильно понял вопрос. Исправляюсь:

    class TestModel(models.Model):
        first = models.TextField(blank=True, null=True)  
        second = models.TextField(blank=True, null=True)  
        is_type = models.BooleanField(default=True, editable=False)
    
        def save(self):
            self.is_type = (self.first or self.second) and (not self.second)
            self.super()
    

    В личной беседе был найден солюшен:

    class TestModel(models.Model):
        micro = models.TextField(blank=True, null=True)  
        macro = models.TextField(blank=True, null=True)  
        is_micro = models.BooleanField(default=True, editable=False)
    
        def save(self):
            self.is_micro = self.micro and not self.macro
            self.super()
    
    ответил 865 дней назад Аватор пользователя vestel vestel
    100 3
    изменил 860 дней назад Аватор пользователя vestel vestel
    100 3
    •  
    • 0
    •  

    Думаю что нереально. Для полей модели можно установить параметр null=True, но поскольку значения полей могут комбинироваться, то всё равно нужно будет в приложении разруливать эти комбинации. Мне кажется что данное разруливание должно относиться к валидации формы. Я бы поступил так, создал форму на основе нашей модели и сделал бы в ней похожую проверку.

    
    #models.py
    class TestModel(models.Model):
        first = models.TextField(blank=True, null=True)  
        second = models.TextField(blank=True, null=True)  
        is_type = models.BooleanField(default=True)
    
    #forms.py
    class TestModelForm(ModelForm):
        class Meta:
            model = TestModel
    
        def clean(self):
            if 'first' in self.cleaned_data and 'second' in self.cleaned_data:
                if not self.second:
                     self.cleaned_data['is_type'] = False
                return self.cleaned_data
            raise forms.ValidationError(_(u'Хотя бы одно из полей должно быть установлено'))
    
    
    

    Как-то так, код не проверял.

    ответил 865 дней назад Аватор пользователя Alexandr Alexandr
    313 15
Чтобы написать ответ, вы должны авторизироваться.