django {%tag%}问题

时间:2011-01-05 16:43:10

标签: django django-views django-urls

我不知道是不是我的{%tag ???我有点零星的行为(django ver 1.2.3)。我有以下main.html文件:

<html>
{% include 'main/main_css.html' %}
<body>
test! <a href="{% url login.views.logout_view %}">logout</a>
test! <a href="{% url client.views.client_search_last_name_view %}">logout</a>
</body>
</html>

,urls.py为:

from django.conf.urls.defaults import *
import settings
from login.views import *
from mainapp.views import *
from client.views import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^weclaim/', include('weclaim.foo.urls')),
    (r'^login/$', 'login.views.login_view'),
    (r'^logout/$', 'login.views.logout_view'),
    (r'^$', 'mainapp.views.main_view'),

    (r'^client/search/last_name/(A-Za-z)/$', 'client.views.client_search_last_name_view'),
    #(r'^client/search/post_code/(A-Za-z)/$', 'client.views.client_search_last_name_view'),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
)

以及用于登录的views.py:

from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib import auth
import mainapp.views

def login_view(request):
    if request.method == 'POST':
        uname = request.POST.get('username', '')
        psword = request.POST.get('password', '')
        user = auth.authenticate(username=uname, password=psword)
        # if the user logs in and is active
        if user is not None and user.is_active:
            auth.login(request, user)
            return redirect(mainapp.views.main_view)
        else:
            return render_to_response('loginpage.html', {'login_failed': '1',}, context_instance=RequestContext(request))
    else:
        return render_to_response('loginpage.html', {'dave': '1',}, context_instance=RequestContext(request))

def logout_view(request):
    auth.logout(request)
    return render_to_response('loginpage.html', {'logged_out': '1',}, context_instance=RequestContext(request))

和客户端的views.py是:

from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
import login.views

def client_search_last_name_view(request):
    if request.user.is_authenticated():
        return render_to_response('client/client_search_last_name.html', {}, context_instance=RequestContext(request))
    else:
        return redirect(login.views.login_view)

然而,当我登录时,django会为{% url client.views.client_search_last_name_view %}提出“NoReverseMatch”,但不会为{% url login.views.logout_view %}

提出

现在为什么会这样?

3 个答案:

答案 0 :(得分:2)

“client.views.client_search_last_name_view”url的正则表达式为一个值(带有parens)设置了一个值,因此为了{% url %}它,你需要为它传递一个值。

答案 1 :(得分:1)

AFAIK您要为每个网址正则表达式添加名称='foo'arg。该名称是反向匹配中使用的名称。像这样:

urls.py

(r'^login/$', 'login.views.login_view', name="login"),

template.html

{% url login %}

答案 2 :(得分:1)

如果您要创建一个应该接受姓氏的URL,则正确的方法如下:

(r'^client/search/last_name/(?P<last_name>[a-zA-Z]+)/$',
    'client.views.client_search_last_name_view'),

正则表达式的(?P<last_name>[a-zA-Z]+)部分允许您捕获长度至少为一个字符的姓氏,然后将其作为参数传递给您的视图函数。

但是,您需要确保您的视图接受此参数:

def client_search_last_name_view(request, last_name):
    ...

你不能这样做的原因:

{% url client.views.client_search_last_name_view %}

是因为你的正则表达式(如视图)声明它需要一个参数,这是一个由A到Z的小写或大写字母组成的字符串。所以例如这可以工作:

{% url client.views.client_search_last_name_view 'somelastname' %}

如果您想为您的网址name提供另一个答案建议您可以,但这是一个单独的问题,除了缩短该模板标记外没有任何其他效果。


{% url login.views.logout_view %}确实有效的原因是因为urls.py中的条目指定要传递给视图的任何参数,并且仅通过默认值就没有传递任何参数

相关问题