模型类
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 Formsets - form.is_valid() is False preventing formset validation form.is_valid() always returning false
我有一种感觉,错误的原因在于我的模型表单类的结构。
.is_valid为false,因为我在if语句中放置了一个代码并且它没有运行,但是如果我有一个else语句(不在这里),如果它无效,它将出现。
任何人都可以提供另一种调试此类错误的方法吗?
答案 0 :(得分:3)
一些问题,如果您粘贴的代码格式不正确,则很难调试代码。压痕很乱,所以我不确定这是否会导致问题。
您似乎在手动为模型分配外键。我建议让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
我在您的观点中看到的一些问题包括:
您可以直接保存表单,因为它是ModelForm。如果您需要刚刚创建的实例,即从save方法返回的实例,您可以设置一个变量并使用它,如下所示。
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实例。
答案 1 :(得分:1)
DTing有一些很好的观点,但我怀疑你的实际问题与模型上id
字段的明确定义有关。除非你有真的好的理由,否则你永远不应该这样做 - Django自动定义一个自动增量字段,除非你使用的是无法更改的遗留数据库,否则几乎没有任何一点可以覆盖它
在您的情况下,您已将其定义为没有自动增量的tinyint。这意味着在任何表单上都需要该字段,因为每次创建新实例时都需要手动指定该字段。您没有显示用于显示表单的模板,因此无法确定,但我想您根本没有显示此字段。
如果你真的想以这种方式继续这样做,你需要在exclude = ('id',)
表格上指定Meta
。然后在你的is_valid子句中,接受DTing的建议,你需要这样做:
if form.is_valid():
instance = form.save(commit=False)
instance.id = some_function_for_calculating_id()
instance.save()
但正如我所说,你根本不应该这样做。