在 Django Admin 中基于父模型预填充内联

Posted

技术标签:

【中文标题】在 Django Admin 中基于父模型预填充内联【英文标题】:Prepopulating inlines based on the parent model in the Django Admin 【发布时间】:2010-12-25 09:26:57 【问题描述】:

我有两个模型,EventSeries,其中每个事件都属于一个系列。大多数情况下,事件的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)

我在管理应用程序中使用内联,这样我就可以一次编辑一个系列的所有事件。

如果已经创建了一个系列,我想用系列的default_time 为每个内联事件预填充start_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,]

我不知道如何从这里开始。是否可以扩展代码,使start_time 字段的初始值是系列的default_time

【问题讨论】:

看到这个:***.com/questions/442040/… 【参考方案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

这里的系列将是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)

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

【讨论】:

对不起,我不明白答案。在哪里将 create_foo_form 函数挂接到 Django 管理员? 只需在管理模块中的modeladmin类之前的任何位置创建函数。 无法以这种方式访问​​系列变量?

以上是关于在 Django Admin 中基于父模型预填充内联的主要内容,如果未能解决你的问题,请参考以下文章

在 Django Admin FilteredSelectmultiple 小部件中预填充选定值

Django Admin:从 POST 或 GET 预填充值?

在Django Admin中将预填充的段塞字段设置为只读

Django Admin:如何只保存内联模型而不是父模型

预填充 Django(非模型)表单

基于 Web 请求预填充 Django 表单