首页 > 解决方案 > django模型表单不保存数据

问题描述

我想用 django 创建一个 todolist 应用程序。我为列表模型创建了一个表单,但是当用户单击提交提交列表时,表单没有保存,为什么?

这是views.py 我已经创建了表单的一个实例并将用户字段设置为它然后保存该实例但实际上它没有

def index(request):
    if request.user.is_authenticated:
        user_ = User.objects.get(username=request.user.username)
        lists = user_.user.all()
        form = listForm()
        if request.method == "POST":
            form = listForm(request.POST)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.user = request.user
                instance.save()
            return HttpResponseRedirect(reverse("index"))
        context = {'lists':lists, 'form':form}   
        return render(request, 'todolists/index.html', context)
    else:
        return render(request, 'todolists/login.html')   

这是索引模板

{% extends "todolists/layout.html" %}
{% block body %}
{% if user.is_authenticated %}
    <div class="center-column">
        <form method="POST" action="{% url 'index' %}"> 
            {% csrf_token %}
            {{form.title}}
            <input type="submit" class="btn btn-info">
        </form>
        <div class="todo-list">
            {% for list in lists %}
                <div class="item-row">
                    <a class="btn btn-sm btn-info" href="{% url 'update' list.id %}">update</a>
                    <a class="btn btn-sm btn-danger" href="{% url 'update' list.id %}">delete</a>
                    <span>{{list}}</span>
                </div>
            {% endfor %}
        </div>
    </div>
{% endif %} 
{% endblock %}

这是 urls.py

from django.urls import path
from .import views

urlpatterns = [
   path('', views.index, name='index'),
   path('update/<str:id>/', views.update, name='update'),
   path("login", views.login_view, name="login"),
   path("logout", views.logout_view, name="logout"),
   path("register", views.register, name="register"),
]

这是models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    pass

    
class list(models.Model):
    title = models.CharField(max_length=200)
    finished = models.BooleanField(default=False)
    timestamps = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
        
    def __str__(self):
        return self.title

这是表单代码

class listForm(forms.ModelForm):
    title= forms.CharField(label=mark_safe("<span style='color:white;'>Title:</span>"),
     widget= forms.TextInput(attrs={'placeholder':'Add new task...', 'class':'form-control'}))
    finished= forms.BooleanField(label=mark_safe("<span style='color:white;'>Finished:</span>"),
     widget= forms.CheckboxInput(attrs={'style':'width:25px;'}))

    class Meta:
        model = list
        fields = '__all__'

标签: djangoformsmodelsave

解决方案


尝试将您的模板文件更新{{ form.title }}{{ form }}django 文档中提到的链接

title如果只需要HTML 中的字段,请更新您的 forms.py 文件

class listForm(forms.ModelForm):
    title= forms.CharField(label=mark_safe("<span style='color:white;'>Title:</span>"),
     widget= forms.TextInput(attrs={'placeholder':'Add new task...', 'class':'form-control'}))
    

    class Meta:
        model = list
        fields = ('title', )

推荐阅读