Как заставить одно и только одно из двух полей быть обязательным в Django?

#python #django

Вопрос:

Итак, вот пример модели Django:

     from django.db import models
    from django.core.exceptions import ValidationError

    class MyModel(models.Model):
        field1 = models.CharField(null=True)
        field2 = models.CharField(null=True)

        def clean(self):
            if self.field1 and self.field2:
                raise ValidationError(
                    'Please select only field1 OR field2, not both.')

            elif self.field1 is None and self.field2 is None:
                raise ValidationError(
                    'Please select field1 or field2.')
 

Чего я хочу добиться, так это заставить администратора моего приложения выбрать одно и только одно поле из двух доступных. Проблема в том, что мой код хорошо предотвращает добавление нового объекта с выбранными обоими полями , но он не препятствует добавлению нового объекта без выбранных полей; вторая часть работает только в то время, когда администратор хочет отредактировать объект без field1 «ни field2 «, но в первую очередь его можно добавить, что я хочу предотвратить. Есть какие-нибудь идеи о том, как я могу это исправить?

Комментарии:

1. elif not self.field1 and not self.field2: ?

2. Вау. Это работает, большое спасибо!

Ответ №1:

Если человек не заполнит поле формы, он увидит, что это пустая строка , нет None , таким образом, вы должны проверить правдивость элементов (поэтому он будет соответствовать, если поле None или пустая строка '' ):

 def clean(self):
    if self.field1 and self.field2:
        raise ValidationError(
            'Please select only field1 OR field2, not both.')
    elif self.field1 and self.field2:
        raise ValidationError(
            'Please select field1 or field2.') 

Комментарии:

1. Спасибо за ваше объяснение, в этом есть полный смысл!