2011-05-28 160 views
9

我有一個Django管理員窗體。 現在我想用基於我的模型的數據填充它的初始字段。所以,我想這一點:Django AdminForm字段默認值

class OrderForm(forms.ModelForm): 
    class Meta: 
     model = Order 

    email = CharField(initial="null", widget=Textarea(attrs={'rows': 30, 'cols': 100})) 

    def __init__(self, *args, **kwargs): 

     self.request = kwargs.pop('request', None) 

     products = kwargs['instance'].products.all() 

     self.message = purchase_message % (
      "".join(["<li>" + p.name + ": " + str(p.price) + "</li>" for p in products]), 
      reduce(lambda x, y:x + y.price, products, 0) 
     ) 

     # and here I have a message in self.message variable 

     super(OrderForm, self).__init__(*args, **kwargs) 

在這一點上,我不知道如何訪問電子郵件字段來設置它的初始值小部件之前被渲染。我怎樣才能做到這一點?

回答

5

我不太清楚你需要設置電子郵件地址,但你可以在很多不同的地方設置初始值。

您的功能def init()沒有正確縮進,我猜是一個錯字?另外,你爲什麼要特別給電子郵件表格字段TextInput?它已經使這個小工具在默認情況下

可以在設置電子郵件的初始值窗體的初始化(高清__的init __(個體經營)

(self.fields['email'].widget).initial_value = "something" 

或model.py

email = models.CharField(default="something") 

或者你有forms.py

email = models.CharField(initial="something") 
4

我需要第一個pastylegs的解決方案,因爲其他人會覆蓋整個Widget,例如幫助文本。但是,他發佈它並不適合我。相反,我不得不這樣做:

self.fields['email'].initial = 'something' 

以我爲例,我是想在Django管理形式的領域做一個個性化的自動增量(根據目前的數據,而不是一個簡單的默認值)。

39

假設值基於 '請求' 您應該使用這樣的:

class MyModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(MyModelAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['my_field_name'].initial = 'abcd' 
     return form 
10

由於Django的1.7存在的ModelAdmin函數get_changeform_initial_data,設置初始形式值:

def get_changeform_initial_data(self, request): 
    return {'name': 'custom_initial_value'} 

編輯:除此之外,@Paul Kenjora的答案無論如何都適用,如果您已經覆蓋get_form,這可能很有用。

如果是inline(InlineModelAdmin),則不存在get_changeform_initial_data。您可以覆蓋get_formset並設置formset.form.base_fields['my_field_name'].initial

+0

如果您自然使用模型管理員的自定義窗體類 – ozgur 2016-12-26 15:13:54

+0

@ozgur,它不起作用。如果您使用自定義表單類,則只需按照另一個答案中的建議使用'get_form'。如果不是,那絕對沒有理由這樣做。 – Wtower 2016-12-26 17:04:40

+0

如果您提供初始值的字段通過'exclude'屬性排除,因爲'base_fields'不包含排除的字段,所以其他答案也不起作用。 – ozgur 2016-12-26 17:38:53