2012-03-25 77 views
1

我有一個模型有一些永遠不應該編輯的字段,例如「創建日期」。我想要顯示一個帶有額外信息的文本字段的表單,可能只是<span>中的數據本身。一個人可以編輯幾個字段,同時他們可以看到關於模型實例的額外信息,例如創建,最後修改,甚至是數據庫中與該對象有關的對象。有沒有辦法使用Django的內置框架來做到這一點,或者我將不得不通過將整個對象傳遞給模板來創建自己的自定義窗體?帶有額外信息的Django表格

如果這需要更多的澄清,隨時問。

+0

你目前如何創建表單?我不知道模型是否有一個快捷方式,但Claude的答案顯示了我知道的方式,在表單類中填充了一個Meta對象。 – forivall 2012-03-25 05:34:53

+0

我正在使用ModelForm和Form。今晚我會考慮這兩個建議,看看我能想出什麼。 – andermic 2012-03-26 20:36:27

回答

0

我知道要做到這一點,最好的辦法是你傳遞一個initial字典的形式或通過表單模板之前初始化場將instance對象傳遞給表單。

然後,您應該確保這些字段已禁用,或者您應該將它們設爲隱藏字段,然後將字段顯示爲常規文本。

最重要的是,如果您將數據傳遞給客戶端,然後將數據發送回表單,則應確保進入的數據與出去的數據相同(出於安全考慮)。使用表單上的clean_[field]函數執行此操作。它應該如下所示。

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
    def clean_date_created(self): 
     if self.cleaned_fields['date_created'] != self.instance.date_created: 
      raise ValidationError, 'date_created has been tampered' 
     self.cleaned_fields['date_created'] 

[編輯/附錄]或者,你可以直接將數據傳遞到您的模板分別渲染,然後對數據釘到表單中你得到它後,回到你的看法。它應該是這樣的:

def recieve_form(request, ...): 
    ... 
    f = MyForm(request.POST, instance=a) 
    new_model_instance = f.save(commit=False) 
    new_model_instance.date_created = <whatever> 
    new_model_instance.save() 
0

要做到這一點,我通常定製的形式,以用於微爲只讀,如下所示:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'my_field': forms.TextInput(attrs={'disabled':'disabled'}), 
     } 

這將輸出一個只讀文本字段,但我想你也可以創建一個Widget這隻會輸出<div><p>(或任何你需要的)