为了清楚起见,我有几个相关问题,并在一个主题下发布.
# Django/django_bookmarks/urls.py urlpatterns = patterns('', (r'^$', main_page), (r'^user/(\w+)/$', user_page), (r'^login/$', 'django.contrib.auth.views.login'), ) # login.htmlDjango Bookmarks - User Login User Login
{% if form.errors %}Your username and password didn't match. Please try again.
{% endif %}
根据这本书,login.html使用form.has_errors
而不是form.errors
.但是,form.has_errors
即使输入错误的用户/密码,也不会打印任何警告消息.经过一番调查后,我将其更改为form.errors
适用于我的工作.
问题1>应该使用哪一个form.errors
或form.has_errors
?
问题2>如果form.has_errors
不起作用,为什么django首先不抱怨.这本书是为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 %}
谢谢
form.has_errors
未在表单api中记录.我快速查看了源代码,我无法在Django 1.3或1.0.X分支的svn checkout中找到它.在你正在使用的书中,这似乎是一个错误.
签form.errors
入你的模板很好.
如果你试图form.has_errors
在视图中访问,你会得到一个AttributeError
.但是,当尝试访问模板中不存在的变量时,Django不会抱怨,因此{{ form.has_errors }}
无声地失败.有关详细信息,请参阅模板变量的文档.
要自省表单上的属性,请使用dir
表单对象而不是视图.
>>> from django.contrib.auth.views import AuthenticationForm >>> dir(AuthenticationForm)
但是我建议你去探索api文档.
当您使用Django的跨站点请求伪造保护时,需要csrf令牌.