2016-07-28 4 views
0

私はDjangoをかなり新しくしており、このエラーの原因を完全に突き止めています。私はたくさんの検索をしましたが、無駄です!どんな助けも非常に高く評価されます。フォームを使用するとDjangoのURLエラーが発生する

実際のフォームが正常に動作しますが、私がしようとすると、入力データを提出するとき、私はエラーを取得:

from django.conf.urls import url 
from django.contrib import admin 
from django.conf.urls import include 

urlpatterns = [ 
url(r'^admin/', admin.site.urls), 
url(r'', include('spirit3.urls')), 
] 

私のURL:個人用サイトのディレクトリに

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order: 

^admin/ 
^$ [name='home'] 
^patientlist [name='patient_list'] 
^patientdetail/(?P<pk>\d+)/$ [name='patient_detail'] 
^add_patient/$ [name='add_patient'] 

The current URL, spirit3/add_patient/, didn't match any of these. 

私urls.pyは次のようになりますアプリの.pyは次のようになります。

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
url(r'^$', views.home, name='home'), 
url(r'^patientlist', views.patient_list, name='patient_list'), 
url(r'^patientdetail/(?P<pk>\d+)/$', views.patient_detail, name='patient_detail'), 
url(r'^add_patient/$', views.add_patient, name='add_patient'), 
] 

views.pyの該当部分:

def add_patient(request): 
    if request.method == 'POST': 
     form = PatientForm(request.POST) 
     if form.is_valid(): 
      form.save(commit=True) 
      return redirect('home') 
     else: 
      print form.errors 
    else: 
     form = PatientForm() 
    return render(request, 'spirit3/add_patient.html', {'form':form}) 

とHTMLは次のようになります。

{% extends 'spirit3/base.html' %} 

{% block content %} 
<body> 
    <h1> Add a Patient </h> 
    <form action="/spirit3/add_patient/" method="post"> 
     {% csrf_token %} 
     {{ form }} 
     <input type="submit" value="Create Patient" /> 
    </form> 
</body> 
{% endblock %} 

事前に感謝を! :)

+0

アプリが「spirit3」と呼ばれているという理由だけで、URLがそれを使用するわけではありません。あなたはあなたが探している修正がわからないが、spirit3のURLを含むURLを変更することができます(文字列の連結として考える) – Sayse

答えて

2

フォーム「アクション」は属性が間違っている...あなたは/spirit3/add_patient/ URLを持っていけない、あなたのURLの構成を見て、私はそれが/add_patient/

であるか、あなただけの「アクション」せずにフォームタグを使用することができると思いますそれが現在のページに掲載します:

<form role="form" method="post"> 
    {% csrf_token %} 
    {{ form }} 
    <input type="submit" value="Create Patient" /> 
</form> 

希望pleasedontbelongはmentionnedとして、これは

+0

それはトリックでした完璧!ありがとうございました:) –

+0

@KirstyRussellハードコードURLを消してください - 私たちは理由のためにそれらの名前をcfに返します。 –

0

を助け、何のURLマッチング "/ spirit3/add_patient /" は、あなたの現在のURLの設定で確かにありません。あなたがツアールートのURLconfを持っていることである。

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'', include('spirit3.urls')), 
] 

これは、パスとURLが始まることを意味し、「/ adminには/」admin.site.urlsにルーティングされ、他のすべてのはspirit3.urlsにルーティングされます。これは「/ spirit3 /」でspirit3.urlsで定義されて接頭辞 URLのいずれかの方法でないことに注意してください、あなたのケースではそう、これらのすべてのURL:

urlpatterns = [ 
    url(r'^$', views.home, name='home'), 
    url(r'^patientlist', views.patient_list, name='patient_list'), 
    url(r'^patientdetail/(?P<pk>\d+)/$', views.patient_detail,  name='patient_detail'), 
    url(r'^add_patient/$', views.add_patient, name='add_patient'), 
    ] 

はルートパスの下に直接提供されます「/」 - すなわち、add_patientビューは "/ add_patient /"によって提供され、 "/ spirit3/add_patient /"では提供されません。

あなたのspirit3アプリのURLが「/ spirit3/*」の下にルーティングされるようにしたい場合は、つまり、あなたのルートのURLconfにこのプレフィックスを指定する必要があります:あなたは接頭辞を使用することができます

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^spirit3/', include('spirit3.urls')), 
] 

注意を、あなたのアプリ名とはまったく無関係です。

最後の注意:絶対にハードコードURLをどこにも置かないで、djangoは名前からURLを逆にする方法を知っています(もしあればargs/kwargs)。テンプレートでは{% url %} templatetagで、コードではdjango.core.urlresolvers.reverse()を使用します。

+0

Thanks Bruno!それは今意味がある。ヘルプをよろしくお願いします。 –

+0

@KirstyRussellがうれしいです。そしてもし私がしたら、私の答えをupvoteに自由に感じてください;) –

関連する問題