Как найти form.has_errors ИЛИ form.errors и, в первую очередь, включить ошибку - PullRequest
8 голосов
/ 14 ноября 2011

У меня есть несколько связанных вопросов и сообщение для одной темы для ясности.

# Django/django_bookmarks/urls.py    
urlpatterns = patterns('',
    (r'^$', main_page),
    (r'^user/(\w+)/$', user_page),
    (r'^login/$', 'django.contrib.auth.views.login'),
)    

# login.html
<html>
  <head>
    <title>Django Bookmarks - User Login</title>
  </head>

  <body>
    <h1>User Login</h1>
    {% if form.errors %}
    <p>Your username and password didn't match.
      Please try again.</p>
    {% endif %}
    <form method="post" action=".">
      {% csrf_token %}
      <p><label for="id_username">Username:</label>
    {{ form.username }}</p>
      <p><label for="id_password">Password:</label>
    {{ form.password }}</p>
      <input type="hidden" name="next" value="/" />
      <input type="submit" value="login" />
    </form>
  </body>
</html>

На основании книги , login.html использует form.has_errors вместо form.errors.Тем не менее, form.has_errors не печатает никаких предупреждающих сообщений, даже если я ввел неправильный логин / пароль.После некоторого исследования я изменяю его на form.errors, и он работает для меня.

Вопрос 1> Какой из них следует использовать form.errors или form.has_errors?

Вопрос 2> Если form.has_errors не работает, почему Джанго не жалуется в первую очередь.Книга была написана для Django 1.0, и я использую Django 1.3.Это причина?

Вопрос 3> Как проверить, какие атрибуты имеет форма?Я попробовал следующее, и оно не дает нужную мне информацию.

python manage.py shell
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import django.contrib.auth.views
>>> dir(django.contrib.auth.views)
['AuthenticationForm', 'HttpResponseRedirect', 'PasswordChangeForm', 'PasswordResetForm', 'QueryDict', 'REDIRECT_FIELD_NAME', 'RequestContext', 'SetPasswordForm', 'User', '_', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'auth_login', 'auth_logout', 'base36_to_int', 'csrf_protect', 'default_token_generator', 'get_current_site', 'login', 'login_required', 'logout', 'logout_then_login', 'never_cache', 'password_change', 'password_change_done', 'password_reset', 'password_reset_complete', 'password_reset_confirm', 'password_reset_done', 'redirect_to_login', 'render_to_response', 'reverse', 'settings', 'urlparse']
>>>
>>> dir(django.contrib.auth.views.login)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

Вопрос 4> Когда необходимо следующее утверждение?

{% csrf_token %}

Спасибо

Ответы [ 2 ]

10 голосов
/ 14 ноября 2011

form.has_errors не задокументировано в формах api .Я быстро просмотрел исходный код и не смог найти его ни в Django 1.3, ни в своем svn checkout из ветки 1.0.X.Кажется, что это ошибка в используемой вами книге.

Проверка form.errors в вашем шаблоне - это нормально.

Если вы пытались получить доступ к form.has_errors ввид, вы бы получили AttributeError.Однако Django не жалуется, когда пытается получить доступ к переменной, которая не существует в шаблоне, поэтому {{ form.has_errors }} завершается с ошибкой.Для получения дополнительной информации см. Документы по шаблонным переменным .

Чтобы проанализировать атрибуты формы, используйте dir для объекта формы, а не для представления.

>>> from django.contrib.auth.views import AuthenticationForm
>>> dir(AuthenticationForm)

Однако я рекомендую вместо этого изучить формуляр api документов.

Токен csrf необходим при использовании Django межсайтовой защиты от подделки запросов .

2 голосов
/ 14 ноября 2011

form.has_errors - это просто логическое значение (True/False). Это удобный метод для тестирования, если форма имеет ошибки или нет (очевидно).

form.errors, с другой стороны, является фактическим массивом ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...