form.is_valid() 总是返回 false
模型类
class Fuzz_Engine(models.Model):
id = PositiveTinyIntField(primary_key = True)
engine_name = models.CharField(max_length=16)
version = models.CharField(max_length = 16)
class Meta:
db_table = 'fuzz_engine'
unique_together = ('engine_name', 'version')
class AddFuzzEngineForm(ModelForm):
class Meta:
model = Fuzz_Engine
视图类
def addengine(request)
if request.method == 'POST':
form = AddFuzzEngineForm(request.POST)
# input validation for add phone model form
if form.is_valid():
fuzzEngineToAdd = Fuzz_Engine (engine_name = request.POST['engine_name'], version = request.POST['version'])
fuzzEngineToAdd.save(force_insert=True)
return render_to_response('fuzz/fuzz_cengine_results.html', {'fid': fuzzEngineToAdd.id,'fe': fuzzEngineToAdd,},context_instance=RequestContext(request))
else:
form = AddFuzzEngineForm()
return render_to_response('fuzz/add_fuzz_engine.html', {'form': form},context_instance=RequestContext(request))
我查了一些类似的问题,试着打印出错误信息,但似乎没有显示出来。
Django 表单集 - form.is_valid() 返回 False,导致表单集验证失败 form.is_valid() 总是返回 False
我觉得错误的原因可能在于我的模型表单类的结构。
因为我在那个 if 语句里放了代码,但它没有运行,所以 .is_valid 返回 false。不过如果我有一个 else 语句(这里没有),当不合法时就会显示出来。
有没有人能提供其他调试这种错误的方法?
2 个回答
DTing提到了一些很好的观点,但我觉得你真正的问题可能和你在模型中对id
字段的定义有关。除非你有非常好的理由,否则不应该这样做——Django会自动定义一个自增字段,通常没有必要去覆盖它,除非你在使用一个无法更改的旧数据库。
在你的情况下,你把这个字段定义成了一个不自增的tinyint。这意味着在任何表单中,这个字段都是必填的,因为每次创建新实例时都需要手动指定这个字段。你没有展示你用来显示表单的模板,所以我无法确定,但我猜想你根本没有显示这个字段。
如果你真的非常想继续这样做,你需要在表单的Meta
中指定exclude = ('id',)
。然后在你的is_valid条件中,参考DTing的建议,你需要这样做:
if form.is_valid():
instance = form.save(commit=False)
instance.id = some_function_for_calculating_id()
instance.save()
不过如我所说,你根本不应该这样做。
有几个问题,如果你粘贴的代码格式不太好,就很难调试。缩进乱七八糟的,我不确定这是否会导致问题。
看起来你是手动为你的模型分配外键。我建议让Django自己处理模型的ID:
class Fuzz_Engine(models.Model):
engine_name = models.CharField(max_length=16)
version = models.CharField(max_length = 16)
class Meta:
db_table = 'fuzz_engine'
unique_together = ('engine_name', 'version')
你的表单看起来没问题:
class AddFuzzEngineForm(ModelForm):
class Meta:
model = Fuzz_Engine
在你的视图中,我看到一些问题:
- 你不应该直接使用 request.POST['field_names']。你应该从表单中获取清理过的数据。
你可以直接保存表单,因为它是一个模型表单。如果你需要刚创建的实例,可以从保存方法中返回这个实例,你可以设置一个变量来使用,如下所示。
def addengine(request) if request.method == 'POST': form = AddFuzzEngineForm(request.POST) if form.is_valid(): instance = form.save() return render_to_response('fuzz/fuzz_cengine_results.html', {'fid': instance.id,'fe': instance,},context_instance=RequestContext(request)) else: form = AddFuzzEngineForm() return render_to_response('fuzz/add_fuzz_engine.html', {'form': form},context_instance=RequestContext(request))
在你原来的视图中,看起来你试图保存一个没有
id
的 Fuzz_Engine 实例。