update - forms in django example
Prepopulating inlines basado en el modelo principal en el administrador de Django (1)
Tengo dos modelos, Event
y Series
, donde cada Evento pertenece a una Serie. La mayoría de las veces, el start_time
un evento es el mismo que el tiempo start_time
su serie.
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, para poder editar todos los eventos de una serie a la vez.
Si ya se ha creado una serie, quiero rellenar el tiempo de start_time
para cada evento en línea con el tiempo default_time
la serie. Hasta ahora, he creado un formulario de administrador 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
el start_time
la serie?
Creo que debe 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í la serie será la instancia de la series
. Luego, en la clase de administrador en línea:
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)
EDITAR: Este enfoque le permitirá pasar su objeto series
al formulario donde puede usarlo para establecer un valor predeterminado para su campo.