Я не могу найти причину ошибки 405 в моем методе POST.
Я работаю над формой, используя фреймворк Django, и постоянно получаю 405 ошибку, которую никак не могу исправить. У меня есть html-шаблон, который содержит форму, позволяющую администраторам добавлять новые TA в базу данных
accountAdd.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Edit Courses</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 2rem;
background-color: #f4f4f4;
}
.container {
max-width: 600px;
margin: auto;
background: #fff;
padding: 2rem;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
text-align: center;
margin-bottom: 1.5rem;
}
label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
}
select {
width: 100%;
padding: 0.5rem;
margin-bottom: 1rem;
border: 1px solid #ccc;
border-radius: 4px;
}
.button-group {
display: flex;
justify-content: space-between;
}
button {
background-color: #333;
color: #fff;
padding: 0.5rem 1.5rem;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #555;
}
</style>
</head>
<body>
<center>
<div class="container">
<h1>Add Account</h1>
{% if submitted%}
TA added succesfully
{% else %}
<form action ="" method=POST>
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Submit">
</form>
{% endif %}
</div>
</center>
</body>
</html>
Views.py (только соответствующий метод и импорт)
from django.shortcuts import render
from django.views import View
from .models import *
from .forms import *
from django.http import HttpResponseRedirect
class accountAdd(View):
def get(self,request):
submitted = False
if request.method == 'POST':
form = TAForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('accountAdd?submitted=True')
else:
form = TAForm
if 'submitted' in request.GET:
submitted = True
form = TAForm
return render(request,'accountAdd.html', {'form': form, 'submitted': submitted})
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('directory', views.directory.as_view(), name='directory'),
path("courseDetails", views.courseDetails.as_view(), name='courseDetails'),
path("courseEdit", views.courseEdit.as_view(), name='courseEdit'),
path("", views.login.as_view(), name='login'),
path("accountEdit", views.accountEdit.as_view(), name='accountEdit'),
path('courseDetails/<str:courseID>', views.courseDetails.as_view(), name='courseDetails' ),
path("accountAdd", views.accountAdd.as_view(), name='accountAdd'),
]
TA модель в models.py
class TA(models.Model):
name = models.CharField(max_length=100)
phoneNum = models.CharField(max_length = 10)
email = models.CharField(max_length = 100)
officeHours = models.CharField(max_length = 100)
password = models.CharField(max_length = 100, default = "pass")
Что может быть причиной этой проблемы? Я использую sql-lite, который автоматически добавляет идентификаторы в таблицы, может ли это иметь какое-то отношение к проблеме?
from django.shortcuts import render
from django.views import View
from django.http import HttpResponseRedirect
from .forms import TAForm
class AccountAdd(View):
def get(self, request):
form = TAForm()
submitted = request.GET.get('submitted') == 'True'
return render(request, 'accountAdd.html', {'form': form, 'submitted': submitted})
def post(self, request):
form = TAForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accountAdd?submitted=True')
return render(request, 'accountAdd.html', {'form': form, 'submitted': False})
Попробуйте использовать приведенный выше код в views.py. Потому что для метода, который не разрешен, возникает ошибка 405.В вашем views.py вы написали код для метода get.Но из браузера вы отправили запрос POST.Вот почему возникает ошибка 405.Метод get в views.py вызывается только для запроса GET, а не для запроса POST.
It doesn't make much sense to use a simple View
in this case, since the logic your view has, is a typically CreateView
pattern:
from django.views.generic import CreateView
class AccountCreateView(CreateView):
form_class = TAForm
template_name = 'accountAdd.html'
def get_context_data(self, *args, **kwargs):
return super().get_context_data(
*args, **kwargs, submitted='submitted' in request.GET
)
def get_success_url(self):
return '/accountAdd?submitted=True'
Usually you however reverse URLs, instead of constructing one as a string literal or with string interpolation.
Note: In Django, class-based views (CBV) often have a
…View
suffix, to avoid a clash with the model names. Therefore you might consider renaming the view class toAccountCreateView
, instead of.accountAdd
Note: Django's templates are usually given names in
snake_case
, soaccount_add.html
instead of.accountAdd.html