2011-01-05 1 views
0

Я не знаю, если это мне, но {% tag ??? %} ведет себя немного спорадически вокруг меня (django ver 1.2.3). У меня есть следующий main.html файл:django {% tag%} проблема

<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)) 

и мнения. ру для клиентов:

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 %}

Теперь, почему это было?

ответ

1

Если вы создаете URL, который предполагается принять фамилию правильный путь будет выглядеть следующим образом:

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

Часть регулярного выражения позволяет вам фиксировать фамилию, которая является хотя бы одним символом а затем передать его в качестве аргумента для вашей функции просмотра.

Однако затем вы должны убедиться, что ваш взгляд действительно примет этого аргумент:

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 делает не указать любые аргументы, которые должны быть переданы в представление и, по умолчанию, в одиночку вы не прошли никакой.

+0

Руки вверх ... Вы правы! Как вы можете видеть из других комментариев, я решил запустить с POST, потому что я хочу перечислить всех клиентов по алфавиту. Я не предполагаю, что регулярное выражение не принимает ничего похожего на POST? – Sevenearths

+0

Вы не должны использовать POST, если вы предлагаете, чтобы использование POST делало его безопасным, и это не так. POST должен использоваться только для отправки данных на сервер, а не для отображения страницы результатов поиска пользователю. Запрос GET должен использоваться для всех страниц, которые можно просмотреть. –

+0

Ваше право снова! Я только начинал с неправильного пути, когда думал о том, как лучше всего выполнять поиск в поиске (или подавать текстовый ввод, если на то пошло) – Sevenearths

2

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

+0

no joy :(Я все еще получаю> Caught NoReverseMatch при рендеринге: Обратный для 'client.views.client_search_last_name_view' с аргументами '(1,)' и ключевыми аргументами '{}' не найден. <Когда я использую> {% url client.views.client_search_last_name_view 1%} < – Sevenearths

+0

Возможно, проверьте, что «клиент» находится в вашем INSTALLED_APPS? –

+0

@Sevenearths: Если у вас есть '(A-Za-z)' в вашем регулярном выражении, это не сработает, если вы пройдете '1' в качестве аргумента, это должно быть письмо ... Шаблон url будет соответствовать только в том случае, если аргументы совпадают с регулярными выражениями! –

1

AFAIK вы хотите добавить имя = 'foo' arg для каждого из ваших регулярных выражений url. Это имя используется в обратном совпадении. Как это:

urls.py

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

template.html

{% url login %} 
+0

Как вы можете видеть из моего воспроизведения в lazyscience в (http://stackoverflow.com/questions/4599423/using-url-in-django-templates) PyCharm просит меня импортировать различные библиотеки, чтобы заставить его работать. И неважно, какой из них я импортирую, я всегда получаю недопустимую синтаксическую ошибку. – Sevenearths