Wagtail ModelAdmin > 如何为 InlinePanel 设置初始数据?
Wagtail ModelAdmin > how to set initial data for an InlinePanel?
我创建了一个 Planning
和一个 Meeting
模型。我使用 Wagtail 的 ModelAdmin
来管理它们。 Planning
有一个 planning_panels
这是一个 InlinePanel
.
对于其他模型,我可以使用表单的 __init__
方法设置初始数据。
但是我不知道如何为 InlinePanel
使用的 formsets
实现这个。有人有什么想法吗?这是代码:
class Planning(ClusterableModel):
base_form_class = PlanningForm
planning_panels = [
InlinePanel(
'planning_meetings',
min_num = 2,
max_num = 8,
label = 'meetings'
)
)
edit_handler = TabbedInterface([
ObjectList(planning_panels, heading=_('meetings')),
])
class PlanningMeeting(models.Model):
planning = ParentalKey(
'cms.Planning',
related_name='planning_meetings',
)
start = models.DateTimeField(
'start'
)
finish = models.DateTimeField(
'finish'
)
panels = [
FieldPanel('start'),
FieldPanel('finish')
]
class Meta:
verbose_name = 'Planned meeting'
class PlanningForm(WagtailAdminModelForm):
class Meta:
fields = '__all__'
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
if not instance or not instance.pk:
initial = kwargs.get('initial', {})
initial.update({
'some_fiel': 'some_value'
})
kwargs['initial'] = initial
super().__init__(*args, **kwargs)
class CreatePlanningView(CreateView):
pass
class PlanningAdmin(ModelAdmin):
model = Planning
create_view_class = CreatePlanningView
wagtail 的 InlinePanel
是使用 django-modelcluster
包。考虑到这一点,您可以通过覆盖 CreateView
中的 get_instance
方法将初始数据添加到 wagtail create model admin 中,然后添加 planning_meetings
列表。
代码如下:
class CreatePlanningView(CreateView):
def get_instance(self):
instance = super().get_instance()
# add the initial inline panels here
instance.planning_meetings = [
PlanningMeeting(start=start, end=end),
PlanningMeeting(start=start, end=end)
# ... add more initial datas
]
# dont forget to return the instance
return instance
提示来自 django-modelcluster
文档 https://github.com/wagtail/django-modelcluster
我创建了一个 Planning
和一个 Meeting
模型。我使用 Wagtail 的 ModelAdmin
来管理它们。 Planning
有一个 planning_panels
这是一个 InlinePanel
.
对于其他模型,我可以使用表单的 __init__
方法设置初始数据。
但是我不知道如何为 InlinePanel
使用的 formsets
实现这个。有人有什么想法吗?这是代码:
class Planning(ClusterableModel):
base_form_class = PlanningForm
planning_panels = [
InlinePanel(
'planning_meetings',
min_num = 2,
max_num = 8,
label = 'meetings'
)
)
edit_handler = TabbedInterface([
ObjectList(planning_panels, heading=_('meetings')),
])
class PlanningMeeting(models.Model):
planning = ParentalKey(
'cms.Planning',
related_name='planning_meetings',
)
start = models.DateTimeField(
'start'
)
finish = models.DateTimeField(
'finish'
)
panels = [
FieldPanel('start'),
FieldPanel('finish')
]
class Meta:
verbose_name = 'Planned meeting'
class PlanningForm(WagtailAdminModelForm):
class Meta:
fields = '__all__'
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
if not instance or not instance.pk:
initial = kwargs.get('initial', {})
initial.update({
'some_fiel': 'some_value'
})
kwargs['initial'] = initial
super().__init__(*args, **kwargs)
class CreatePlanningView(CreateView):
pass
class PlanningAdmin(ModelAdmin):
model = Planning
create_view_class = CreatePlanningView
wagtail 的 InlinePanel
是使用 django-modelcluster
包。考虑到这一点,您可以通过覆盖 CreateView
中的 get_instance
方法将初始数据添加到 wagtail create model admin 中,然后添加 planning_meetings
列表。
代码如下:
class CreatePlanningView(CreateView):
def get_instance(self):
instance = super().get_instance()
# add the initial inline panels here
instance.planning_meetings = [
PlanningMeeting(start=start, end=end),
PlanningMeeting(start=start, end=end)
# ... add more initial datas
]
# dont forget to return the instance
return instance
提示来自 django-modelcluster
文档 https://github.com/wagtail/django-modelcluster