Я делаю простой список дел с помощью Django, он отлично работает, за исключением того, что любые данные, введенные в форму, не сохраняются в базе данных (и не отображаются).
Мои модели.py:
from django.db import models
class TodoListItem(models.Model):
content = models.TextField()
def __str__(self):
return self.content
формы.ру:
from .models import TodoListItem
from django.forms import ModelForm
class TodoListForm(forms.ModelForm):
class Meta:
model = TodoListItem
fields = ['content']
просмотров.py:
from django import forms
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse
from .models import TodoListItem
from .forms import TodoListForm
def home(request):
context = {
'items': TodoListItem.objects.all()
}
return render(request, 'home.html', context)
def enter_task(request):
if request.method == 'POST':
form = TodoListForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
else:
return HttpResponse('Form not valid')
else:
form = TodoListForm()
return render(request, 'form.html', {'form': form})
Я сделал это в соответствии с документацией, но я не понимаю, почему строка form.save()
не будет выполняться, когда return HttpResponseRedirect('/')
прямо под ней выполняется.
Файл form.html на всякий случай:
<!DOCTYPE html>
<html>
<head>
<title>Add task</title>
<h1>Add Task</h1>
</head>
<body>
<form action = "{% url 'home' %}" method = "post">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Submit">
</form>
</body>
</html>
Я знаю, что ошибка должна быть в views.py, потому что я использовал сайт администратора для добавления в TodoListItem вручную, и html-файл отлично отображает его, просто всякий раз, когда я отправляю форму, она никогда не сохраняется в вышеупомянутой модели.
Бывает, что вы неправильно ввели действие формы
<form action = "{% url 'home' %}" method = "post">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Submit">
</form>
вы должны поместить этот URL в действие формы enter_task
<form action = "{% url 'enter_task' %}" method = "post">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Submit">
</form>
Похоже, ваше действие формы отправляет форму на вашу домашнюю страницу, а не URL-адрес, который указывает на представление enter_task. Я не знаю этого наверняка, не видя вашего urls.py, но это то, что я бы проверил.