Какой самый чистый способ проверки на динамических c формах в Django? - PullRequest
0 голосов
/ 04 мая 2020

Я работаю над проектом интернет-магазина одежды, обуви, аксессуаров. У меня есть форма с категорией, подкатегорией, полем размера и т. Д. c. Если выбранная категория - «одежда» или «обувь», поле размера обязательно. Но если выбрана категория «аксессуары», поле размера скрыто и не требуется, потому что в моем случае аксессуары не имеют размеров. Кроме того, мои выбор категории не жестко запрограммированы, они хранятся в базе данных. Поэтому, когда я выполнял проверку, в чистом методе моей формы я жестко закодировал оператор if, который выдает ошибку, когда выбор категории пользователя отличается от «аксессуаров» и когда поле размера пустое. Но я думаю, что это не очень чисто, потому что утверждение if довольно жестко закодировано. И мой вопрос: есть ли более чистое решение для этой задачи?

class ItemCreateForm(forms.ModelForm):

    class Meta:
        model = Item
        fields = ['category', 'subcategory', 'brand', 'brand_collection', 'price', 'price_negotiable',
                  'size', 'gender', 'condition', 'description']

    def clean(self):
        cleaned_data = super().clean()
        category = cleaned_data.get("category")
        size = cleaned_data.get("size")

        if str(category) != 'accessories' and not size:
            print(category)
            print(size)
            self.add_error('size', 'Това поле е задължително!')

        return cleaned_data

1 Ответ

0 голосов
/ 04 мая 2020

Если эти данные находятся в базе данных, вам, вероятно, нужно будет также хранить лог условия c в базе данных. Вы могли бы придумать свой собственный домен c со спецификацией для домена и вставить «программу» в вашей модели категории в текстовое поле - придуманный пример, который, вероятно, чего-то не хватает:

ifempty size error "Това поле е задължително!"
iflt size 0 error "Size must be >= 0"
ifgt size 50 error "Size must be <= 50"

Это было бы довольно просто написать интерпретатор для чего-то подобного ... Или, если вы чувствуете себя более предприимчивым, может быть, что-то на основе S-выражений? Я бы посоветовал не сохранять там прямую Python, так как в песочнице сложно.

...