Django - ошибка "метод не разрешен" после перемещения ajax-запроса в другое приложение
В моем приложении django есть небольшая форма home, которую я отправляю через jquery ajax запрос. Ниже приведена установка, которая у меня есть
home urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^submitseries/$', views.submitseries, name='submitseries'),
url(r'^getstats/$', views.getstats, name='getstats'),
]
home views.py
def submitseries(request,id=None):
if request.method == "POST":
series_url = request.POST.get("series_url")
# rest of the processing code that is working fine
application urls.py
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path('', include(('home.urls','home'),namespace="home")),
path('series/', include(('series.urls','series'),namespace="series")),
path('submitseries/', include(('home.urls','submitseries'),namespace="submitseries")),
path('players/', include(('players.urls','players'),namespace="players")),
path('admin/', admin.site.urls),
]
Эта установка работает нормально, но я хотел бы переместить этот ajax запрос в другое приложение в моем приложении, которое имеет имя series
Итак, я перенес функцию submitseries в views.py из приложения series app, модифицировав
series urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^$submitseries/', views.submitseries, name='submitseries'),
]
((пробовал разные варианты, такие как series/submitseries/ ))
изменил приложение urls.py следующим образом
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path('', include(('home.urls','home'),namespace="home")),
path('series/', include(('series.urls','series'),namespace="series")),
path('submitseries/', include(('series.urls','submitseries'),namespace="submitseries")),
path('players/', include(('players.urls','players'),namespace="players")),
path('admin/', admin.site.urls),
]
вместо того, чтобы направить его на home.urls, я направил его на series.url
Но он начинает выдавать ошибку 405 Method not allowed error и не важно, что я пытаюсь сделать, я не могу решить эту проблему.
Я пробовал задавать различные варианты пути в urls.py как приложения, так и приложения серии. Я просто не могу заставить его работать. Единственное различие в обеих установках заключается в том, что домашнее приложение является базовым, а относительный путь "http://localhost:8000/submitseries". но когда я перемещаю его в приложение series, базовый url становится следующим "http://localhost:8000/series/submitseries"
Добавление кода AJAX в соответствии с запросом
//function to submit series url and save to DB
$("#save_series").click(function(e){
e.preventDefault();
series_url = $("#series_url").val();
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
console.log("Series URL " + series_url);
$.ajax({
type: "POST",
url: "series/submitseries/",
data: {"series_url":series_url},
headers:{
"X-CSRFToken": csrftoken
},
success: function(result){
message = "Series #" + result["series_id"] + " inserted successfully";
bootstrap_alert['info'](message);
},
error: function(result){
bootstrap_alert['warning'](result.responseJSON.error_msg);
}
});//end of ajax submit
});//end of button click block
Я смог исправить проблему благодаря пользователям, указывающим на различные вещи в комментариях.
Первой подсказкой было предложение @amadou sow использовать подстановку url в JS, используя следующее выражение
{% url 'submitseries:submitseries' %}
Когда я сделал это в атрибуте action формы, я начал получать следующую ошибку
"Reverse for 'submitseries' with no arguments not found. 1 шаблон(ы) tried: ['series/submitseries/$submitseries/']
.
Это дало понять, что что-то не так с конечной точкой, которую я указал в series urls.py
После игры с некоторыми перестановками и комбинациями я обнаружил, что $ оценивается буквально, а не как символ regex в случае подкаталога, и комментарий @BrianD о том, что $ находится в правильном месте, попал в точку.
Наконец, изменив серию urls.py на следующую, все заработало
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^submitseries/', views.submitseries, name='submitseries'),
]
P.S. submitseries - без $ впереди.