问题描述:
在Django中使用表单保存时,出现以下错误信息:
Object is None, but form is valid
代码示例:
假设我们有一个模型类Checklist,它有一个CharField name:
from django.db import models
class Checklist(models.Model):
name = models.CharField(max_length=100)
我们还有一个表单类ChecklistForm,它允许用户创建一个Checklist:
from django import forms
from .models import Checklist
class ChecklistForm(forms.ModelForm):
class Meta:
model = Checklist
fields = ('name',)
当用户提交表单时,我们想要创建并保存一个新的Checklist对象。我们可以使用以下视图函数:
from django.shortcuts import render, redirect
from .forms import ChecklistForm
from .models import Checklist
def create_checklist(request):
if request.method == 'POST':
form = ChecklistForm(request.POST)
if form.is_valid():
# Create and save checklist object
checklist = form.save(commit=False)
checklist.save()
return redirect('checklist_list')
else:
form = ChecklistForm()
return render(request, 'create_checklist.html', {'form': form})
问题
出现此错误的原因是尝试保存一个不存在的对象。form.save(commit=False)将返回未保存的Checklist对象,但此对象仍未在数据库中保存。我们需要在保存之前分配一个默认值。我们可以将以下内容添加到form_valid()方法中:
from django.http import HttpResponseRedirect
def form_valid(self, form):
if self.object is None:
self.object = form.save(commit=False)
self.object.save() # Save the object with a default value
return HttpResponseRedirect(self.get_success_url())
在这个例子中,我们将self.object设置为一个新对象,然后将其保存。在这个例子中,我们分配一个默认值,但您可以分配其他值,例如当前用户或当前时间戳。
您还可以覆盖该视图的get_form_kwargs()方法并将所需的默认值添加到字典中:
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
if self.object is None:
kwargs['initial'] = {'user': self.request.user}
return kwargs
在这个例子中,如果self.object为None,则将用户添加到表单的初始数据中。不管使用什么方法,您都需要分