2009-12-10 16 views
5

Tengo dos modelos, Event y Series, donde cada evento pertenece a una serie. La mayoría de las veces, el Evento start_time es el mismo que su Serie 'default_time.Prepliegue en línea basado en el modelo principal en Django Admin

Aquí hay una versión simplificada de los modelos.

#models.py 

class Series(models.Model): 
    name = models.CharField(max_length=50) 
    default_time = models.TimeField() 

class Event(models.Model): 
    name = models.CharField(max_length=50) 
    date = models.DateField() 
    start_time = models.TimeField() 
    series = models.ForeignKey(Series) 

utilizo inlines en la aplicación de administración, de modo que pueda editar todos los eventos de la serie a la vez.

Si ya se ha creado una serie, quiero rellenar previamente el start_time para cada evento en línea con la serie 'default_time'. Hasta ahora, he creado un formulario de administración de modelo para Evento y utilicé la opción initial para rellenar previamente el campo de tiempo con un tiempo fijo.

#admin.py 
... 
import datetime 

class OEventInlineAdminForm(forms.ModelForm): 
    start_time = forms.TimeField(initial=datetime.time(18,30,00)) 
    class Meta: 
     model = OEvent 

class EventInline(admin.TabularInline): 
    form = EventInlineAdminForm 
    model = Event 

class SeriesAdmin(admin.ModelAdmin): 
    inlines = [EventInline,] 

No estoy seguro de cómo proceder desde aquí. ¿Es posible extender el código, de modo que el valor inicial para el campo start_time sea el default_time de la serie?

+0

ver esto: http://stackoverflow.com/questions/442040/pre-populate-an-inline-formset –

Respuesta

0

Creo que se necesita para cerrar una función sobre un ModelAdmin:

def create_event_form(series): 
    class EventForm(forms.ModelForm): 
     def __init__(self, *args, **kwargs): 
      # You can use the outer function's 'series' here 
    return EventForm 

Aquí serie será el series ejemplo. Luego, en la línea de clases de administración:

class EventInlineAdmin(admin.TabularInline): 
    model = Event 
    def get_formset(self, request, obj=None, **kwargs): 
     if obj: 
      self.form = create_foo_form(obj) 
     return super(EventInlineAdmin, self).get_formset(request, obj, **kwargs) 

EDIT: Este enfoque le permitirá pasar su objeto series a la forma en la que se puede utilizar para establecer un valor predeterminado para el campo.

+0

Lo siento, no entiendo la respuesta. ¿Dónde engancho la función create_foo_form en el administrador de Django? – Alasdair

+0

Simplemente cree la función en cualquier lugar antes de su clase modeladmin en el módulo de administración. – shanyu

+0

He tratado de explicar mi respuesta, espero que ayude esta vez ... – shanyu

Cuestiones relacionadas