- 3
Обязательные поля в 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() требовать, чтобы хотя бы одно из двух полей было заполнено?
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() -
- 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'Хотя бы одно из полей должно быть установлено'))Как-то так, код не проверял.