Проверка формы Django, включая использование данных сеанса - PullRequest
3 голосов
/ 23 сентября 2010

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

Чтобы добиться этого, у меня есть форма Django для сбора общей информации пользователя, которую ПОЗИНАЕТ Django просмотреть «A». Форма отображается с использованием шаблона, который также включает в себя iFrame с простой встроенной кнопкой, которая ссылается на URL-адрес представления Django «B».

Представление «B» просто устанавливает переменную сеанса, чтобы указать, что загрузка произошла, и возвращает URL файла для загрузки, тем самым инициируя загрузку.

В рамках проверки формы «А» (основной формы) мне необходимо проверить, установлена ​​ли переменная сеанса, указывающая загрузку файла.

У меня вопрос: лучше ли это сделать с помощью процесса проверки формы «А», и если да, то как это лучше всего сделать?

Если это не очень хороший подход, где должна проводиться проверка этого события?

Ответы [ 2 ]

11 голосов
/ 24 сентября 2010

Вы можете переопределить метод __init__ для своей формы, чтобы он принимал request в качестве аргумента.

class MyForm(forms.Form):
    def __init__(self, request, *args, **kwargs)
        self.request = request
        super(MyForm, self).__init__(*args, **kwargs)

    def clean(self):
        if not self.request.session.get('file_downloaded', False):
            raise ValidationError('File not downloaded!')

def my_view(request):
    form = MyForm(request, data=request.POST)

Это сохраняет всю логику проверки в форме.

2 голосов
/ 24 сентября 2010

Почему бы и нет, мне кажется, это нормально. Насколько мне известно, наиболее удобный способ доступа к запросу внутри формы - это встраивание его (т. Е. Формы) в функцию:

    def formX(request):
        class FormX(forms.Form):
            def clean(self):
                if not request.session.get('file_downloaded', False):
                    raise ValidationError('File not downloaded!')
        return FormX

( Примечание , что касается clean (), это псевдокод - я писал из своей головы и, вероятно, не помню деталей очистки формы)

Тогда вы просто пишете:

    def my_view(request):
        form = formX(request)(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...