valid update form example crear django django-admin django-forms

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.