2016-09-11 1 views
0

Django 1.10では、URLまたはビュー名による他のビューへのリダイレクトは機能しません。Django 1.10:別のビューにリダイレクトするか、動作していないURLです。 django.urls.exceptions.NoReverseMatch

主urls.pyファイルは以下の通りである:

urlpatterns = [ 
    url(r'^', include('app1.urls')), 
] 

APP1内部urls.pyファイルである:

from django.conf.urls import url 

from . import views 

app_name = 'app1' 
urlpatterns = [ 
    url(r'^$', views.home, name='home'), 
    url(r'^details/$', views.details, name='details'), 

] 

APP1用views.pyは以下の通りである:

from django.shortcuts import render, redirect 
from django.utils.timezone import now 
import datetime 
from django.http import HttpResponse, HttpResponseRedirect 
from django.urls import reverse 

    def home(request): 
     if request.method == 'POST': 
      print("redirected from home..................") 
      url = reverse('details') 
      return HttpResponseRedirect(url) 
      # return redirect('app1:details') 
      # return redirect('/details/') 
      # return redirect('details') 
     print("Not redirected..................") 
     return render(request, "app1/index.html", {}) 


    def details(request): 
     print("Redirect OK inside details") 
     today = datetime.date.today() 
     return render(request, "app1/details.html", { 
      'today': today, 
      'now': now(), 
      'email_text': request.POST.get('email_item', 'bla bla'), 
     }) 

私はHttpResponseRedirectとリダイレクトの両方を使用するようなコメント付きコードでホームビューのすべてのオプションを試しましたが、rできませんでした詳細ビューに移動します。任意の提案が役立つだろう

django.urls.exceptions.NoReverseMatch: Reverse for 'details' with 
arguments '()' and keyword arguments '{'request': <HttpRequest>}' not found. 0 pattern(s) tried: [] 

+0

私は同じことを確認するためにテストを書いています。テストの詳細はこちら:[https://dpaste.de/aYBV](https://dpaste.de/aYBV) – Blueice

+0

プロジェクトディレクトリはこちら[https://dpaste.de/kO0q](https: //dpaste.de/kO0q)とROOT_URLCONF = 'main.urls'を設定/ベースに追加します。py – Blueice

答えて

1

注独自のコード内の作動例

私はエラーを取得します。

アプリ名を指定すると、名前空間を逆にする必要があります。

reverse('details') 

reverse('app1:details') 

はこっちのドキュメントを参照してください読んでください: https://docs.djangoproject.com/en/1.10/ref/urlresolvers/

+1

まだ成功していません。レスポンスコードは302ですが、リダイレクトは行われず、詳細ビューの最初の行に「リダイレクトOK詳細内」も表示されません。 – Blueice

2

私はあなたがずっと前に解決策を見つけたと確信しているが、私は前に、私にこの問題で苦労してきましたあなたを別のビューにリダイレクトするためだけに存在するビューを作成する必要がない、シンプルなソリューションが登場しました。うまくいけば、この質問が依然として必要な人を助けることができます。一般的に、それはこのように書きます:

from django.shortcuts import redirect 
urlpatterns = [ 
    url(r'^$', lambda request: redirect('my_redirect_url_name')), 
    url(r'^my_redirect_url/$', views.redirect_view, name='my_redirect_url_name')) 
] 

は私がなぜわからないんだけど、あなただけredirect()を渡した場合、これは動作しません。それはlambda関数のような関数の中に含まれなければなりません。

あなたがlogin_requiredデコレータまたは別のカスタムログインラムダ関数を使用することができ、ログインページにリダイレクトような単純な何かをしたい場合:

from django.shortcuts import redirect 
from django.contrib.auth.decorators import login_required 
urlpatterns = [ 
    url(
     r'^$', 
     login_required(lambda request: redirect('my_redirect_url_name'), 
           redirect_field_name='my_login_url_name') 
    ), 
    # this custom redirect function will behave like login_required() 
    url(
     r'^$', 
     lambda request: redirect('my_redirect_url_name') if request.user and \ 
      request.user.is_authenticated() else redirect('my_login_url_name') 
    ), 
    url(r'^my_redirect_url/$', views.redirect_view, name='my_redirect_url_name')), 
    url(r'^my_login_url/$', views.login_view, name='my_login_url_name')) 
] 

が具体的にあなたの質問への答えに、私はこのことを考えますあなたが望むリダイレクトを与えます。このurlsに:これにより

from django.shortcuts import redirect 
urlpatterns = [ 
    url(
     r'^$', 
     lambda request: redirect('index') if request.method == 'POST' else \ 
         redirect('details'), 
     name='home' 
    ), 
    url(r'^details/$', views.details, name='details'), 
    url(r'^index/$', views.index, name='index'), 
] 

viewsに追加:

def index(request): 
    return render(request, "app1/index.html", {}) 

ちょうどFYI、私は if request.method == 'POST'を使用してリダイレクトでこれをテストしていませんが、私はそれが動作すると思います。

関連する問題