web-dev-qa-db-ja.com

{%url ???を使用Djangoテンプレートの%}

テンプレートで「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」は次のようになります。

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ファイル。これがなぜなのかわかりません。私には正しくないようです)*

68
Sevenearths

logout_view関数をインポートする代わりに、urls.pyファイルに文字列を指定する必要があります。

(r'^login/', login_view),ではありません

しかし(r'^login/', 'login.views.login_view'),

それが物事の標準的な方法です。次に、次を使用してテンプレートのURLにアクセスできます。

{% url login.views.login_view %}
47
Marcus Whybrow

選択された答えは古く、他の人は私のために働いていません(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>
92
Mike S

(Django 1.5以降)URL名を引用符で囲んでください。URLがパラメーターを取る場合は、outside引用符にする必要があります(この間違いを数時間かけて考えました!)。

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

urlテンプレートタグは、reverse()への関数参照としてではなく、文字列としてパラメーターを渡します。これを機能させる最も簡単な方法は、nameをビューに追加することです。

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

私は同じ問題に遭遇します。

私がドキュメントから見つけたものは、namedspaceを使用する必要があります。

あなたの場合{% url login:login_view %}

12
Alist

あなたの例から判断すると、それは{% url myproject.login.views.login_view %}であり、物語の終わりではないでしょうか? (myprojectを実際のプロジェクト名に置き換えてください)