Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> django управление валидацией данных в формах 
:(
    Опции темы
Stolzen
Дата 18.4.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 1
Всего: 48



Доброе время суток!

Проблема:

Есть модель "оборудование", в которой, помимо прочих, есть два поля: модель и флаг о том, типовое ли оборудование.
Поле "модель" должно быть заполнено всегда.

Задача состоит в том, чтобы если в поле "типовое" стоит "да", то при сохранении автоматически название должно изменяться на "типовое" - при этом не обязательно в форме что-либо в него вводить. 

Код

class Equipment(CommonModel):
# Оборудование 
    model = models.CharField(u"модель", max_length = 20, )
    ...
    is_typical = models.NullBooleanField(u"типовое", blank = True, null = True, )


Пробовал в модель добавлять метод clean_fields, в котором делал проверку:

Код

class Equipment(CommonModel):
    ...

    def clean_fields(self, *args, **kwargs):
        if self.is_typical == True:
            self.model = u"типовое"
            
        super(Equipment, self).clean_fields(*args, **kwargs)


Но проверка к моменту вызова этого метода уже сделана формой с помощью метода _clean_fields  и поэтому я получаю форму с ошибками валидации.

Поэтому пришлось сделать вот такой костыль:

Проверить, если модель - та, в которую нужно добавить метод, то добавляем
Код

    if entity_name == 'Equipment':
        equipment_class(BuildedForm)


Код

def equipment_class(BuildedForm):
    """
    Если установка типовая (в поле 'типовая' стоит 'да') то модель оборудования - 'типовая'
    """
    def _clean_fields(self):
        val = self.data['is_typical'] == '2' # т.е. выбрано "да"
        
        if val:
            # так как QueryDict неизменяемый, то создаем копию
            self.data = self.data.copy()
            self.data['model'] = u"типовая"
            
        super(BuildedForm, self)._clean_fields()
        
    BuildedForm._clean_fields = _clean_fields


Вообщем-то это работает, но мне это не нравится. Есть ли способ сделать лучше?
А то такой подход засоряет остальной код лишней логикой. 



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Веб-разработка и фреймворки | Следующая тема »


 




[ Время генерации скрипта: 0.0368 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.