2016-07-28 51 views
0

我對Django相當陌生,而且我完全停留在導致此錯誤的原因上。我做了很多搜索,但無濟於事!任何幫助將超級讚賞。Django使用表格時的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. 

我在mysite的目錄urls.py樣子:

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')), 
] 

我的網址在的.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使用它。你可以改變這個動作只是'/ add_patient /'儘管我不知道你在找什麼修正,但你可能想改變包含spirit3 url的URL(把它想象成字符串連接) – Sayse

回答

2

的形式是「action」屬性是錯誤的...看到你的網址,配置你沒有一個/spirit3/add_patient/網址,我覺得這是/add_patient/

,或者你可以只使用一個表單標籤沒有「行動」它會發布到當前頁面:

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

希望這有助於

+0

這樣做了完善!非常感謝:) –

+0

@KirstyRussell不要硬編碼的網址 - 我們將它們命名爲一個原因,比較我的答案... –

0

由於pleasedontbelong mentionned,有沒有確實在當前的URL配置URL匹配 「/ spirit3/add_patient /」。您在遊覽根URL配置的是:

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

這意味着開始與路徑的URL「/管理/」被路由到admin.site.urls,和所有其他被路由到spirit3.urls。請注意,這不以任何方式前綴在spirit3.urls以「/ spirit3 /」定義網址,所以你的情況,所有這些網址:

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')), 
] 

注意,您可以使用任何前綴,它與您的應用程序名稱完全無關。

最後一點:永遠不要在任何地方硬編碼網址,django知道如何從它的名字(和args/kwargs,如果有的話)反轉網址。在模板中,您使用{% url %} templatetag執行此操作,代碼中使用django.core.urlresolvers.reverse()

+0

謝謝布魯諾!這是有道理的。感謝幫助 –

+0

@KirstyRussell很高興能爲您提供幫助。如果我這樣做,請隨時提出我的答案;) –