2013-07-30 98 views
53

我在管理站點中註冊了一個模型。其中一個字段是一個長字符串表達式。我想添加自定義表單字段到管理中的這個模型的添加/更新頁面,基於這些字段值,我將構建長字符串表達式並將其保存在相關模型字段中。django admin - 添加不屬於模型的自定義表單域

我該怎麼做?

更新: 基本上我正在做的是從符號建立數學或字符串表達式,用戶選擇符號(這些是不是模型的一部分的自定義字段),當他點擊保存然後我創建一個字符串表達式從符號列表中存儲並存儲在數據庫中。我不希望符號是模型和數據庫的一部分,只有最後的表達。

回答

20

它可以做在管理員,但沒有一個非常簡單的方法。另外,我想建議將模型中的大多數業務邏輯保留下來,這樣您就不會依賴Django Admin。

如果你的模型有兩個獨立的字段,這可能會更容易(甚至更好)。然後在你的模型中添加一個方法來結合它們。

例如:

class MyModel(models.model): 

    field1 = models.CharField(max_length=10) 
    field2 = models.CharField(max_length=10) 

    def combined_fields(self): 
     return '{} {}'.format(self.field1, self.field2) 

然後在管理員可以添加combined_fields()爲只讀字段:

class MyModelAdmin(models.ModelAdmin): 

    list_display = ('field1', 'field2', 'combined_fields') 
    readonly_fields = ('combined_fields',) 

    def combined_fields(self, obj): 
     return obj.combined_fields() 

如果你要存儲在數據庫中的combined_fields你也可以將它保存當你保存模型:

def save(self, *args, **kwargs): 
    self.field3 = self.combined_fields() 
    super(MyModel, self).save(*args, **kwargs) 
+2

感謝您的回答,但是這不是我什麼尋找。我不希望將自定義字段保存在數據庫中,只有計算的字符串。基本上我正在做的是從符號構建數學或字符串表達式,用戶選擇符號(這些是不屬於模型一部分的自定義字段),當他點擊保存時,我從列表中創建字符串表達式表示符號並將其存儲在數據庫中。 – michalv82

+0

@ michalv82您也可以在模型的save()方法中將其保存到數據庫中,檢查我的答案的更新。 – rednaw

+0

再次感謝,但問題是,我不想存儲結合最終字段(即符號)的字段,我只想要保存最終字符串 – michalv82

3

如果你絕對onl Ÿ要結合現場存儲的模型,而不是兩個不同的領域,你可以做這樣的事情:

我從來沒有做過這樣的事情,所以我不能完全確定它是如何工作的。

101

無論是在你的admin.py中,還是在一個單獨的forms.py中,你都可以添加一個ModelForm類,然後像通常那樣在裏面聲明你的額外字段。我還給出瞭如何使用在form.save()這些值的例子:

class YourModelForm(forms.ModelForm): 

    extra_field = forms.CharField() 

    def save(self, commit=True): 
     extra_field = self.cleaned_data.get('extra_field', None) 
     # ...do something with extra_field here... 
     return super(YourModelForm, self).save(commit=commit) 

    class Meta: 
     model = YourModel 

若要出現在管理員只是額外的字段:

  1. 編輯您的管理員。PY並設置窗體屬性指上面創建的形式
  2. 包括新的領域在你的字段或字段集聲明

像這樣:

​​

UPDATE: 在Django 1.8你需要將fields = '__all__'添加到YourModelForm的元類中。

+4

這個答案沒有被接受嗎? – sthzg

+2

是的,我真的想知道原因 – Vishnu

+8

您應該在'Meta'類中添加'fields ='__all __'',否則django會抱怨:'不建議'fields'屬性或'exclude'屬性創建ModelForm ' – IsaacKleiner

4

你總是可以創建新的管理模板,你在你的admin_view需要什麼(覆蓋管理員添加URL到您的admin_view):

url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model') 
相關問題