Модель формы не может быть сохранена в базе данных

Я новичок в Django Я хочу сохранить данные формы в базе данных, но у меня не получается сохранить, я прослушал несколько руководств

form.py:

from django.forms import ModelForm

from .models import *

class listsForm(ModelForm):

    class Meta:
        model = todo
        fields = "__all__"

views.py:

from django.shortcuts import render

from .models import *

from .form import *

def index(request):

    lists = todo.objects.all()
    form = listsForm()
    context = {
        'lists':lists,
        'form':form,
    }
    if request.method == 'POST':
        form = listsForm(request.POST)
        if form.is_valid:
            form.save()

    return render(request, 'index.html', context)

models.py:

from django.db import models

class todo(models.Model):

    title = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    created = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.title

Почему вы рендерите listsForm? Ваша форма должна быть в шаблоне, а не отображаться!

В index.html ваша форма должна выглядеть следующим образом:

<form action="{% url 'create_todo' %}" method="POST">
 {% csrf_token %}
 <div class="form-group">
 <label for="title">Title</label>
 <input type="text" name="title" class="form-control" id="title" required></div>
 <div class="form-group">
 <label for="Description">Description</label>
 <textarea name="description" class="form-control" id="description" ></textarea></div>
 <button type="submit" class="btn btn-primary">Submit</button>
 </form>    

В views.py

def index(request):
    return render(request, 'index.html')


def create_todo(request):
    if request.method == 'POST':
       form = listsForm(request.POST)
       if form.is_valid():
       form.save()
       return redirect('index')

В urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('create_todo/', views.create_todo, name='create_todo')
]

Вам все равно придется выводить существующие todos, предпочтительно в другом шаблоне.

Так в views.py

def alltodos(request):
    todos = Todo.objects.all()
    return render(request, 'index.html', {'todos':todos})

В index.html, над формой или после нее, не имеет значения, просто для ясной видимости

<div class="row justify-content-center mt-5">
        <div class="col-md-10">
        {% if todos %}
            <div class="list-group">
                {% for todo in todos %}
                    <a class="list-group-item list-group-item-action><b>{{ todo.title }}</b>{{ todo.description|truncatechars:30 }}{% endif %}</a>
                {% endfor %}
            </div>
        {% else %}
            <div class="text-center">
                <h2>Looks like you don't have any todos!</h2>
            <br>
            </div>
        {% endif %}
        </div>
    </div>

В urls.py добавить

  path('todos', views.alltodos, name='alltodos'),

Дополнительный проект моего

Я выяснил, почему он не работает,

Я использовал <input type="button"> для кнопки submit но когда я заменил ее на <button type="submit">, она работает.

Вернуться на верх