2011-05-28 28 views
9

Django yönetici formu var. Ve şimdi ilk alanımı modelime dayalı verilerle doldurmak istiyorum. Yani bu çalıştı: Bu noktadaDjango AdminForm alan varsayılan değer

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) 

i Widget oluşturulmadan önce başlangıçtaki değer ayarlamak için e-posta alanını erişmek nasıl bilmiyorum. Bunu nasıl yapabilirim?

cevap

5

sana e-posta ayarlamak gerekenler çok emin değilim, ama farklı yerlerde bir sürü içinde ilk değerlerini ayarlayabilirsiniz.

Fonksiyonunuz def init() doğru girintili girilmez, bu bir yazım hatası mı? Ayrıca, neden e-posta formunu özellikle bir TextInput veriyorsunuz? Zaten sen de postanızın başlangıç ​​değerini ayarlayabilirsiniz varsayılan

bu widget'ı kılmaktadır Formunuz en başlatıldı (def __ init __ (self))

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

veya model.py içinde

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

veya forms.py

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

sahip olarak Diğerleri, örneğin, yardım metni de dahil olmak üzere tüm Widget'ın üzerine yazdığından beri, pastylegs'in ilk çözümüne ihtiyacım vardı. Ancak, o yayınladı olarak benim için işe yaramadı. Bunun yerine, bunu yapmak zorunda: Benim durumumda

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

, bir Django yönetici formunun bir alanda kişiselleştirilmiş (güncel verilere dayalı değil, basit bir varsayılan) otomatik artış yapmaya çalışıyordu. değerinin,

39

isteğine 'dayanır, bu kullanmalıdır:

başlangıç ​​formu değerlerini ayarlar ModelAdmin bir fonksiyon get_changeform_initial_data vardır Django'ya 1.7 yana
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

:

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

Düzenleme: Bunun dışında, @Paul Kenjora'nın cevabı zaten geçerlidir, zaten get_form'u geçersiz kılarsanız yararlı olabilir.

inline durumunda (InlineModelAdmin) bir get_changeform_initial_data yoktur. get_formset'u geçersiz kılabilir ve formset.form.base_fields['my_field_name'].initial'u ayarlayabilirsiniz.

+0

sen @ozgur doğal modeli yönetici – ozgur

+0

için özel bir form sınıfı kullanıyorsanız eğer çalışmaz. Özel form sınıfı kullanıyorsanız, başka bir yanıtta önerildiği gibi 'get_form' kullanın. Eğer olmasa da, bunu yapmak için kesinlikle bir neden yoktur. – Wtower

+0

diğer yanıt, başlangıç ​​değeri sağladığınız alanın 'exclude' özelliği ile hariç tutulduğu için çalışmaz, çünkü base_fields özelliği hariç tutulan alanları içermez. – ozgur