簡體   English   中英

form.is_valid()總是返回false

[英]form.is_valid() always returning 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 Formsets-form.is_valid()為False防止 表單集 驗證 form.is_valid()始終返回false

我感覺錯誤的原因在於我的模型表單類的結構。

.is_valid為false,因為我在if語句中放置了一個代碼,但該代碼無法運行,但是如果我有else語句(此處不存在),則它會無效。

任何人都可以提供另一種調試此類錯誤的方法嗎?

幾個問題,如果您粘貼的代碼格式不正確,則很難調試代碼。 壓痕是一團糟,所以我不確定這是否引起問題。

似乎您正在為模型手動分配外鍵。 我建議只是讓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']。 您應該從表單中獲取cleaned_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實例。

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()

但是正如我所說,您根本不應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM