1. ホーム
  2. django

[解決済み] url ?%} を使用する %} を使用する

2023-02-27 19:41:21

質問

私はテンプレートで '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」が表示されるのでしょうか?

*(少し違うノートで、私はすべての私のrender-to-responseの終わりに'context_instance=RequestContext(request)'を使わなければなりませんでした。そうしないと、私のテンプレートで{{ MEDIA_URL }}を認識せず、私はどんなcssやjsファイルも参照できませんでした。なぜなのかはよくわかりません。私には正しいとは思えません)*。

どのように解決するのですか?

をインポートする代わりに logout_view 関数の中で文字列を提供する必要があります。 urls.py ファイルに記述します。

では無く (r'^login/', login_view),

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

というのが標準的なやり方です。そして、テンプレート内のURLにアクセスするには、以下を使用します。

{% url login.views.login_view %}