{%urlを使用する??? djangoテンプレートの%}


83

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


1
あなたが言っていることcontext_instance=RequestContext(request)は正しいです、これはすべてのテンプレートに提供されたコンテキスト変数へのテンプレートアクセスを許可するために必要です。これは、すべての汎用ビューに対してデフォルトで実行されますが、カスタムビューで自分で実行する必要があります。
マーカスホワイブロウ2011年

サイト全体の一貫性を保つために、テンプレートから常にcssファイルとjsファイルにアクセスするため、私には少し奇妙に思えます。したがって、デフォルトで{{MEDIA_URL}}にアクセスできるべきではありませんか?
ロバートジョンストーン

1
ここでの受け入れ答えは、もはや有効ではない
ダン・ゲイル

新しい答えを追加して、それを受け入れます
Robert Johnstone

回答:


54

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

そうではない (r'^login/', login_view),

だが (r'^login/', 'login.views.login_view'),

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

{% url login.views.login_view %}

2
ええ、間違いなく文字列を使用してください。このように、プレフィックスを使用することもでき、すべてのビュー関数をURLConfにインポートする必要はありません。
Sri Raghavan 2011年

これも試してみましたが、レンダリング中に「Caught NoReverseMatch:Reverse for'login.views.login_views 'with arguments'()」とキーワード引数「{}」が見つかりませんでした。再び:(
ロバートジョンストーン

待って...それをスクラッチ!私は15分待って、もう一度試してみましたが、うまくいきました(yippeeee !!!)。いいですね1.次の質問。管理ページに追加したサイトが1つしかない場合、これに{%url ???という接尾辞を付けるにはどうすればよいですか。%}
ロバートジョンストーン

はい、これはネクロですが、URLタグは2015年もまだ私を噛んでいます。構文を変更し続けなければ役立つでしょう:
Dave

6
私がグーグルからここに来たという理由だけで、django 1.8+に関しては、ビュー引数として文字列を渡すことは非推奨であり、まもなく削除されると言わなければなりません。この投稿のように、実際に呼び出し可能オブジェクトを渡す必要があります。
user3599803 2016年

104

選択した回答は古く、他の人は私のために働いていません(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>

1
ええ、私は知っています。{% load url from future %}現在1.4で使用しています。良い場所
Robert Johnstone

5
これが答えとして選択されるべきです。URLの逆一致に文字列を使用することは、新しいdjangoバージョンでは非推奨です。
Sumudu 2016

44

URL名を引用符で囲んでいることを確認してください(django 1.5以降)。URLがパラメーターを受け取る場合、引用符の外にある必要があります(この間違いを理解するのに何時間も費やしました!)。

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

これは古い答えだと思いますが、これは本当に役に立ちました。私はDjango1.6のフォークであるdjango-norelを使用していますが、URL名を引用符で囲むと、取得していたTypeErrorが修正されたため、この問題も発生するはずです。
robobrobro 2015年

2
正しいドキュメントを使用すると、構文が変更され続けるため{% url app_views.client client.id %}{% url 'app_views.client' client.id %}(引用符なし)1.4、(引用符付き)1.5 -1.7、および{% url 'app-views-client' client.id %}(アンダースコアやドットなし、ダッシュのみ)1.8でも役立ちます 。
デイブ

主よ、私はすぐに1.8にアップグレードすることを計画していました。
ボガティーリ2015

17

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

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

私はそれを試しましたが、 '無効な構文(urls.py、14行目)' :(
Robert Johnstone

これについて本当に奇妙なのは、ライブラリのインポート(libxml2mod.nameまたはunicodedata.nameまたはtwisted.trial.runner)を推奨せずに、上記のように> name = 'logout_view' <を使用できないことです(PyCharm-素敵なアプリ)。名前)
Robert Johnstone

関数はどこでreverse()定義されていますか?
CodyBugstein 2014年

テンプレートで{%url'logout_view '%} django.readthedocs.org/en/latest/intro/tutorial03.html
Juan Rojas

12

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

ドキュメントからわかったことは、名前空間を使用する必要があります。

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


今日では、名前空間をより多く使用しています。URLを読みやすくし、実際に何かを意味します
Robert Johnstone

ドキュメントのリンクを含めてもらえますか?
geoidesic 2018

1

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


上記と同じ 'レンダリング中にNoReverseMatchをキャッチしました:' weclaim.login.views.login_views 'に対して、引数'() 'およびキーワード引数' {} 'が見つかりませんでした。(私のプロジェクト名は、すべてのコードが格納されているルートディレクトリと同じ名前だと思います)
Robert Johnstone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.