2011-05-28 26 views
9

Tengo un formulario de administrador de Django. Y ahora quiero completar su campo inicial con datos basados ​​en mi modelo. Así que he intentado esto:Valor predeterminado de campo de 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) 

En este punto no sé cómo acceder campo de correo electrónico para establecer su valor inicial antes de efectuar el artilugio. ¿Cómo puedo hacer esto?

Respuesta

5

No estoy muy seguro de a qué necesita configurar el correo electrónico, pero puede establecer los valores iniciales en muchos lugares diferentes.

Su función def init() no está sangrada correctamente, lo que supongo que es un error tipográfico? Además, ¿por qué especifica el campo de formulario de correo electrónico TextInput? Ya hace este widget por defecto

Puede establecer el valor inicial del correo electrónico en su forma inicializado (def __ init __ (self))

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

o en el model.py

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

o como usted tiene en forms.py

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

Necesitaba la primera solución de pastylegs ya que los demás sobrescribían el Widget completo, incluido, por ejemplo, el texto de ayuda. Sin embargo, no funcionó para mí, ya que lo publicó. En su lugar, tenía que hacer esto:

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

En mi caso, yo estaba tratando de hacer un incremento automático personalizado (basado en los datos actuales y no un defecto simple) en un campo de un formulario de Django administrador.

39

Suponiendo que el valor se basa en 'solicitud' se debe utilizar esto:

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

Desde Django 1.7 existe una función get_changeform_initial_data en ModelAdmin que establece los valores iniciales del formulario:

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

EDIT: Aparte de eso, la respuesta de @Paul Kenjora se aplica de todos modos, lo que podría ser útil si ya anulas get_form.

En caso de en línea (InlineModelAdmin) no hay get_changeform_initial_data. Puede anular get_formset y establecer formset.form.base_fields['my_field_name'].initial.

+0

No funciona si está utilizando una clase de formulario personalizada para el administrador de modelo – ozgur

+0

@ozgur, naturalmente. Si usa una clase de formulario personalizada, simplemente use 'get_form' como se recomienda en otra respuesta. Si no es así, no hay absolutamente ninguna razón para hacerlo. – Wtower

+0

Otra respuesta tampoco funciona si el campo que proporciona un valor inicial se excluye mediante la propiedad 'exclude' porque' base_fields' no incluye los campos excluidos. – ozgur

Cuestiones relacionadas