form.is_valid()总是返回false

时间:2011-05-09 02:52:40

标签: python django

模型类

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语句(不在这里),如果它无效,它将出现。

任何人都可以提供另一种调试此类错误的方法吗?

2 个答案:

答案 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

我在您的观点中看到的一些问题包括:

  1. 你不应该直接使用request.POST ['field_names']。你应该从表单中获取cleaning_data。
  2. 您可以直接保存表单,因为它是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))
    
  3. 使用原始视图,您似乎尝试保存没有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()

但正如我所说,你根本不应该这样做。