根据Django Admin中的父模型预先填充内联

Ala*_*air 5 django django-forms django-admin

我有两个型号,Event并且Series,其中每个事件属于一个系列.大多数情况下,一个事件start_time与它的系列相同default_time.

这是模型的精简版.

#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)
Run Code Online (Sandbox Code Playgroud)

我在管理应用程序中使用内联,以便我可以一次编辑系列的所有事件.

如果已经创建了一个系列,我想start_time用系列' 预填充每个内联事件default_time.到目前为止,我已经为Event创建了一个模型管理表单,并使用该initial选项以固定时间预填充时间字段.

#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,]
Run Code Online (Sandbox Code Playgroud)

我不知道如何从这里开始.是否可以扩展代码,以便该start_time字段的初始值是Series' default_time

sha*_*nyu 1

我认为你需要通过 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
Run Code Online (Sandbox Code Playgroud)

这里系列就是一个series例子。然后在内联管理类中:

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)
Run Code Online (Sandbox Code Playgroud)

编辑:这种方法将使您能够将series对象传递到表单,您可以在其中使用它来设置字段的默认值。