Я много искал в Google ответы о том, как использовать тег «url» в шаблонах, только чтобы найти много ответов, в которых говорилось: «Просто вставьте его в свой шаблон и укажите на то представление, для которого требуется URL-адрес». Что ж, никакой радости для меня :( Я пробовал все возможные варианты и прибегал к публикации здесь в крайнем случае.
Итак, вот оно. Мой urls.py выглядит так:
from django.conf.urls.defaults import *
from login.views import *
from mainapp.views import *
import settings
# 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_view),
(r'^logout/', logout_view),
('^$', main_view),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
#(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': '/home/arthur/Software/django/weclaim/templates/static'}),
(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
)
Мой 'views.py' в моем каталоге 'login' выглядит так:
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib import auth
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 render_to_response('main/main.html', {}, context_instance=RequestContext(request))
#return redirect(main_view)
else:
return render_to_response('loginpage.html', {'box_width': '402', 'login_failed': '1',}, context_instance=RequestContext(request))
else:
return render_to_response('loginpage.html', {'box_width': '400',}, context_instance=RequestContext(request))
def logout_view(request):
auth.logout(request)
return render_to_response('loginpage.html', {'box_width': '402', 'logged_out': '1',}, context_instance=RequestContext(request))
и, наконец, main.html, на который указывает login_view:
<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>
Так почему я каждый раз получаю «NoReverseMatch»?
* (немного другое примечание, мне пришлось использовать context_instance = RequestContext (request) в конце всех моих запросов на рендеринг в ответ, потому что в противном случае он не распознал бы {{MEDIA_URL}} в моих шаблонах, и я не мог ссылаться любые файлы css или js. Я не уверен, почему это так. Мне это не кажется правильным) *
источник
context_instance=RequestContext(request)
шаблоне, правильно, это необходимо, чтобы разрешить шаблону доступ к переменным контекста, предоставленным всем шаблонам. Это делается по умолчанию для всех общих представлений, но вам нужно сделать это самостоятельно в своих пользовательских.Ответы:
Вместо импорта
logout_view
функции вы должны указать строку в своемurls.py
файле:Так что не
(r'^login/', login_view),
но
(r'^login/', 'login.views.login_view'),
Это стандартный способ работы. Затем вы можете получить доступ к URL-адресу в своих шаблонах, используя:
источник
Выбранный ответ устарел, и у меня не работали другие (Django 1.6 и [очевидно] без зарегистрированного пространства имен.)
Для Django 1.5 и новее (из документации )
С именованным URL-адресом вы можете:
(r'^login/', login_view, name='login'), ... <a href="{% url 'login' %}">logout</a>
Так же просто, если представление принимает другой параметр
def login(request, extra_param): ... <a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a>
источник
{% load url from future %}
1.4. Хорошее местоУбедитесь (django 1.5 и выше), что вы поместили имя URL-адреса в кавычки, и если ваш URL-адрес принимает параметры, они должны быть вне кавычек (я потратил часы, выясняя эту ошибку!).
{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %} <a href="{{ the_url }}"> link_name </a>
источник
{% url app_views.client client.id %}
(без кавычек) в 1.4,{% url 'app_views.client' client.id %}
(с кавычками) в 1.5 -1.7 и{% url 'app-views-client' client.id %}
(без подчеркиваний или точек, только тире) в 1.8.url
Шаблонный тег будет передать параметр в виде строки , а не в качестве функции ссылкиreverse()
. Самый простой способ заставить это работать - добавитьname
в представление:url(r'^/logout/' , logout_view, name='logout_view')
источник
reverse()
определяется функция ?У меня такая же проблема.
Что я нашел из документации, мы должны использовать пространство имен.
в твоем случае
{% url login:login_view %}
источник
Судя по вашему примеру, разве это не
{% url myproject.login.views.login_view %}
конец истории? (заменитеmyproject
фактическим названием проекта)источник