django {% tag%} проблема - PullRequest
       1

django {% tag%} проблема

0 голосов
/ 05 января 2011

Я не знаю, если это я, но {% 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>

с URL-адресом:

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 вызывает NoReverseMatch для {% url client.views.client_search_last_name_view %}, но не для {% url login.views.logout_view %}

Теперь, с чего бы это?

Ответы [ 3 ]

2 голосов
/ 05 января 2011

Регулярное выражение URL-адреса "client.views.client_search_last_name_view" захватывает значение (вместе с паренами), поэтому для {% url %} его необходимо передать значение этого параметра.

1 голос
/ 06 января 2011

Если вы создаете 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' %}

Если вы хотите указать свой URL-адрес name, как предлагает другой ответ, вы можете это сделать, но это отдельный вопрос, который не имеет никакого эффекта, кроме сокращения этого тега шаблона.


Причина, по которой {% url login.views.logout_view %} работает, заключается в том, что его запись в urls.py не не указывает какие-либо аргументы, передаваемые представлению, и только по умолчанию вы не передали никаких.

1 голос
/ 06 января 2011

AFAIK, вы хотите добавить аргумент name = 'foo' в каждое из ваших регулярных выражений URL.Это имя используется в обратном матче.Вот так:

urls.py

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

template.html

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