2011-06-16 57 views
3

我有一個模型,它包含一個帶有外鍵的字段,並且此字段可以爲NULL,並且是可選的。如果此字段沒有值,我可以將此表單保存在管理頁面中,不會有任何問題。然而,當有我的窗體上的錯誤,我的表格不能被渲染和Django的返回以下錯誤:當Django發生錯誤時呈現管理窗體

Caught ValueError while rendering: need more than 0 values to unpack on line 19 
9    {% for field in line %} 
10     <div{% if not line.fields|length_is:'1' %} class="field-box{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}> 
11      {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} 
12      {% if field.is_checkbox %} 
13       {{ field.field }}{{ field.label_tag }} 
14      {% else %} 
15       {{ field.label_tag }} 
16       {% if field.is_readonly %} 
17        <p>{{ field.contents }}</p> 
18       {% else %} 
19        {{ field.field }} 
20       {% endif %} 
21      {% endif %} 
22      {% if field.field.field.help_text %} 
23       <p class="help">{{ field.field.field.help_text|safe }}</p> 
24      {% endif %} 
25     </div> 
26    {% endfor %} 
27   </div> 
28  {% endfor %} 
29 </fieldset> 

這裏是我的模型看起來像:

class Circuit(CommonFields): 
    """Circuit class model.""" 
    vid = models.AutoField(primary_key=True) 
    vname = models.CharField(
     'Vendor Name', 
     max_length=100, 
     null=True, 
     blank=True) 
    vspc = models.ForeignKey(
     Room, 
     db_column='avspc', 
     verbose_name='Space', 
     null=True, 
     blank=True) 

這裏是我的自定義乾淨()爲我的自定義表單:

def clean(self): 
    """Custom port range validator.""" 
    super(CircuitForm, self).clean() 
    raise forms.ValidationError("Some stupid error just happened.") 
    cleaned_data = self.cleaned_data 
    return cleaned_data 

需要注意的是,如果我刪除raise語句,我的表格可以成功提交,但是,當我提出一個錯誤,它給我上面的錯誤。

任何想法如何在出現錯誤時渲染我的表單?

請注意,只有當我創建新條目時沒有設置可選字段或編輯沒有設置可選字段的條目時,就會發生此錯誤。如果我正在編輯具有這些可選字段集的現有條目,並且未設置可選字段,則不會發生任何錯誤。

+0

我其實這樣做是固定的。我正在使用字典在__init__方法中手動初始化這些字段,而我不得不使用這樣的元組列表:[(「」,「--Select--」)]。對造成的不便表示歉意。 – mohi666 2011-06-16 23:27:11

+3

如果你可以把它放在一個答案中,然後將其標記爲正確,它將幫助其他類似問題的人。 – 2011-06-23 03:34:08

+1

我在您的清潔方法中看到一個問題。您在提出ValidationError之前必須已經忘記了if子句,無論您的數據是什麼,這個乾淨的方法總是會引發ValidationError。也許只是一個錯字? – 2011-07-15 18:49:52

回答

0

@GeoffroyCALA是對的,你需要條件來引發異常。如果你沒有檢查條件,反正會有異常。此外,您不指定爲其設置自定義異常的表單字段。請參閱docs example

嘗試類似的東西:

def clean(self): 
    """Custom port range validator.""" 
    cleaned_data = self.cleaned_data 

    if cleaned_data['vpc'] not in Room.objects.values_list('id', flat=True): # FOR EXAMPLE 
     raise forms.ValidationError("Some stupid error just happened.")   

    super(CircuitForm, self).clean() 

    return cleaned_data