1. Новичок

    26.07.2010

    0 ↑
    0 ↓
    здравсвуйте.
    Имеется форма
    from django import forms

    class UrlForm(forms.Form):
    url = forms.URLField(label='url', verify_exists=False)

    проверяю на валидацию так:
            form = UrlForm(request.POST)
    if form.is_valid():
    ....
    else:
    return render_to_response('...', {'errors':form.errors})
    Выводит ошибку
    'dict' object has no attribute 'render_context'
    Как исправить? И как добавить в is_valid свои правила валидации для данного поля? Такие как сравнение с определенным значением?
  2. Как исправить?

    Подозреваю, что что-то напутали с параметрами render_to_response

    И как добавить в is_valid свои правила валидации для данного поля?

    http://docs.djangoproject.com/en/1.2/ref/forms/validation/#cleaning-a-specific-field-attribute

  3. Новичок

    27.07.2010

    0 ↑
    0 ↓
    Спасибо. Однако возникла проблема.
    Пишу:
    class UrlForm(forms.Form): 
    url = forms.URLField(label='url', verify_exists=False)

    def clean(self):
    cleaned_data = self.cleaned_data
    url = cleaned_data.get("url")
    if url=="foo.ru":
    msg = u"Must put 'help' in subject when cc'ing yourself."
    self._errors["url"] = self.error_class([msg])
    del cleaned_data["url"]
    return cleaned_data
    Однако когда я пишу в поле http://foo.ru эта ошибка не вылетает, а валидация проходит успешно.

    Пробовал и так:
        def clean(self):
    cleaned_data = self.cleaned_data
    url = cleaned_data.get("url")
    if url=="foo.ru":
    raise forms.ValidationError("Did not send for 'help' in "
    "the subject despite CC'ing yourself.")

    return cleaned_data
  4. ildus

    27.07.2010

    0 ↑
    0 ↓

    ну как он может вылететь, сами пишете http://foo.ru, а проверяете на равенство с foo.ru

  5. Новичок

    27.07.2010

    0 ↑
    0 ↓
    Я писал и http://foo.ru и просто foo.ru
  6. Почитайте, пожалуйста, внимательнее текст по моей ссылке, это раз.

    Поотлаживайте свой код, посмотрите, что на самом деле лежит в cleaned_data['url'], это два.

  7. macpages.livejournal.com

    27.07.2010

    0 ↑
    0 ↓
    Ребят, была похожая проблема с текстом "'dict' object has no attribute 'csrf_exempt'". Я использовал стандартный декоратор csrf_exempt и думал, что он обязателен для формы. Однако закомментировав строчку с декоратором, но оставив {% csrf_token %} в шаблоне токен прекрасно генерируется и работает. Так и должно быть?
  8. Новичок

    27.07.2010

    0 ↑
    0 ↓
    1. прочитал все еще раз, как я понял, если мне необходимо проводить дополнительную валидацию какого либо поля, то я создаю функцию clean_<field name>
    При этом я хочу формировать словарь ошибок, следовать тельно буду использовать self._errors
    Вот мой код:
    from django import forms     

    class UrlForm(forms.Form):

    url = forms.URLField(label='url', verify_exists=False)

    def clean_url(self):
    url = self.cleaned_data['url']
    if url == "http://www.example.com":
    msg = u'FUCK!'
    self._errors["url"] = self.error_class([msg])

    return url
    2. Сказали проверить что лежит в cleaned_data['url']
    я забил все это дело в manage.py shell
    И написал:
    In [21]: u = UrlForm()

    In [22]: u.url='http://www.bbeeasd.su/'

    In [23]: u.cleaned_data['url']
    ---------------------------------------------------------------------------
    AttributeError Traceback (most recent call last)

    AttributeError: 'UrlForm' object has no attribute 'cleaned_data'
    Помогите решить проблему, пожалуйста! Как провести проверку данных и сформировать ошибку?
  9. igorekk

    27.07.2010

    0 ↑
    0 ↓
    cleaned_data появляется после вызова is_valid
  10. Новичок

    27.07.2010

    0 ↑
    0 ↓
    Забыл сказать, во вьюхе валидация проходит успешно...
  11. Новичок

    27.07.2010

    0 ↑
    0 ↓
    Провел сначала is_valid(), вот что получилось
    In [26]: u = UrlForm()

    In [27]: u.url='http://www.yandex.ru/'

    In [28]: u.is_valid()
    Out[28]: False
    Вообще не понимаю. почему false?
  12. Новичок

    27.07.2010

    0 ↑
    0 ↓
    Попытался вот так:
    # -*- coding:utf-8 -*-
    from django import forms

    class UrlForm(forms.Form):

    url = forms.URLField(label='url', verify_exists=False)

    def clean_url(self):
    data = self.cleaned_data['url']
    if "ex123ample.com" == data:
    raise forms.ValidationError("You have forgotten about Fred!")

    return data
    При этом в shell:
    In [26]: u = UrlForm()

    In [27]: u.url='http://www.yandex.ru/'

    In [28]: u.is_valid()
    Out[28]: False
    А во вьюхе:
        if request.method == 'POST':
    form = UrlForm(request.POST)
    if form.is_valid():
    url = form.cleaned_data.get('url')
    ....
    return render_to_response('template1.html', {'url':url})

    else:
    return render_to_response('template2', {'errors':form.errors['url']})

    else:
    return render_to_response('temaplte2', clear_form(request))
    Если я не ввожу значение то ошибка вывоодится о незаполненом поле. Если ввожу в поле 'http://www.yandex.ru/' все прекрасно работает.
    Как такое может быть?
    Помогите разобраться...
  13. admin

    27.07.2010

    1 ↑
    0 ↓

    вы можете передать связанные данные в джанго-форму только параметром конструктора. после этого есть смысл вызывать метод is_valid().

    >>> form = UrlForm({'url': 'http://yandex.ru/'})
    >>> form.is_valid()
    True
    
  14. Новичок, перестаньте стучать по всем клавишам сразу.

    Если я не ввожу значение то ошибка вывоодится о незаполненом поле.

    Логично, разве нет?

    Если ввожу в поле 'http://www.yandex.ru/' все прекрасно работает.

    "Прекрасно" это как? Сохраняет все? Тоже логично, "ex123ample.com" == data дает False.

    Выведите уже внутри clean_url текущие значения (через print, pdb или наконец Exception киньте, чтоб джанговскую страницу ошибки увидеть со всем переменными) и посмотрите, что там чему равно. Неужели так приятно пытаться перебрать двигатель через выхлопную трубу, и удивляться, что получается какая-то ерунда?

  15. Новичок

    28.07.2010

    0 ↑
    0 ↓
    Приношу свои извинения, что так нафлудил в теме. Просто ничего не получалось ну и + того что мой ник соответсвует действительности.
    Все получилось, проверив все в shell увидел что в cleaned_data строка лежит, как юникодовская.
    Подставив все получилось!
    Спасибо. Приношу еще раз свои извинения за флуд.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.