Django - Как лучше всего обрабатывать ValidationErrors после form.save (commit = False) - PullRequest
1 голос
/ 31 марта 2010

Это фрагмент моего кода из вида:

    if form.is_valid():
        instance = form.save(commit=False)
        try:
            instance.account = request.account
            instance.full_clean()
        except ValidationError, e:
            # Do something with the errors here... I certainly don't want to do this 180 times.

Это полный беспорядок. Кто хотел бы обрабатывать ошибки проверки вручную в каждом представлении. Если вы не изменяете экземпляр после save(commit=False), вам не нужно об этом беспокоиться, но как насчет моего случая, когда каждая модель имеет внешний ключ для account, который устанавливается за кулисами и скрыт от пользователь

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Я полагаю, form - это ModelForm из-за тега в вопросе.

Поскольку ModelForm выполняет проверку модели при вызове is_valid(), этого должно быть достаточно, чтобы убедиться, что экземпляр модели, который будет проверяться, уже содержит какие-либо скрытые изменения, которые вы хотите внести перед вызовом is_valid().

Вы можете сделать это, изменив form.instance своими изменениями, прежде чем позвонить is_valid().

Более общее решение для внесения таких изменений в самой форме:

class PresetAttrsModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        preset_attrs = kwargs.pop('preset_attrs', None)
        # Sets up self.instance, among other things
        super(ModelForm, self).__init__(*args, **kwargs)
        if preset_attrs:
            for attr, value in preset_attrs.items():
                setattr(self.instance, attr, value)

class MyModelForm(PresetAttrsModelForm):
    class Meta:
        model = MyModel

form = MyModelForm(preset_attrs={'account': request.account})
1 голос
/ 31 марта 2010

Не уверен, что правильно понял вашу проблему, но если вы хотите «централизовать» проверку ваших данных в форме, вы можете перезаписать метод clean () формы:

Django Docs - перезаписать метод очистки

Чтобы изменить данные объекта на основе данных, переданных в форме, вы можете перезаписать метод form.save:

Обсуждение SOF - метод сохранения с перезаписью

...