使用{% url???%}在django模板中

zy1mlcev  于 2023-08-08  发布在  Go
关注(0)|答案(7)|浏览(116)

我在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}),
)

字符串
我的'login'目录中的'views.py'看起来像:

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


最后,login_view指向的main.html如下所示:

<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>


为什么我每次都得到“NoReverseMatch”?

  • (稍微不同的注意,我不得不在所有渲染到响应的末尾使用'context_instance=RequestContext(request)',否则它将无法识别模板中的{{ MEDIA_URL }},我无法引用任何css或js文件。我不确定这是为什么。对我来说似乎不对)*
ar7v8xwq

ar7v8xwq1#

选择的答案已经过时了,没有其他答案适合我(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>

t3irkdon

t3irkdon2#

您不应该汇入logout_view函数,而应该在urls.py档案中提供字串:
所以不是(r'^login/', login_view),
(r'^login/', 'login.views.login_view'),
这是做事的标准方式。然后,您可以使用以下命令访问模板中的URL:

{% url login.views.login_view %}

字符串

hjqgdpho

hjqgdpho3#

确保(django 1.5及更高版本)你把url名称放在引号里,如果你的url带参数,它们应该在引号外面(我花了几个小时才发现这个错误!).

{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %}
<a href="{{ the_url }}"> link_name </a>

字符串

pprl5pva

pprl5pva4#

url模板标记将参数作为字符串传递,而不是作为函数引用传递给reverse()。最简单的方法是在视图中添加一个name

url(r'^/logout/' , logout_view, name='logout_view')

字符串

avwztpqn

avwztpqn5#

我遇到同样的问题。
我从文档中发现的,我们应该使用namedspace。
在您的情况下{% url login:login_view %}

uubf1zoe

uubf1zoe6#

从你的例子来看,它不应该是{% url myproject.login.views.login_view %}和故事结束吗?(将myproject替换为实际项目名称)

6kkfgxo0

6kkfgxo07#

例如,my_app1/views.py中有4个视图,如下所示。* 您可以看到文档详细解释URL命名空间:

# "my_app1/views.py"

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return render(request, 'index.html')

def test1(request):
    return HttpResponse("Test1")

def test2(request):
    return HttpResponse("Test2")

def test3(request):
    return HttpResponse("Test3")

字符串
并且,my_app1/urls.py中有两条路径,如下所示:

# "my_app1/urls.py"

from django.urls import path
from . import views

app_name = "my_app1"

urlpatterns = [
    path('test1/', views.test1, name="test1"),
    path('test2/', views.test2, name="test2"),
]


并且,core/urls.py中有4条路径,如下所示:

# "core/urls.py"

from django.contrib import admin
from django.urls import path, include
from my_app1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('my_app1/', include('my_app1.urls')),
    path('test3/', views.test3, name='test3'),
]


现在,您可以将这些URL命名空间设置为index.html中的url标签,如下所示:

{% "index.html" %}

<a href="{% url 'admin:index' %}">Admin</a>
<a href="{% url 'my_app1:test1' %}">Test1</a>
<a href="{% url 'my_app1:test2' %}">Test2</a>
<a href="{% url 'test3' %}">Test3</a>

相关问题