django-admin 模型被覆盖 change_form.html 缺少上下文
django-admin model with overriden change_form.html missing context
我有以下3个模型,每个都和它的children
有一对多的关系
* Experiment
* Site (lab, schools, etc.)
* Participants
由于一个站点可能有数百名参与者,我已经覆盖了它的模型 change_form.html,我在 'after_field_sets' 块中添加了一个 'bulk create' 表单。
这是我的 my-project/templates/admin/my-app/site/change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block after_field_sets %}
{{ block.super }}
<h3>Bulk Create Participants</h3>
<form method="POST">
<input type="hidden" name="action" value="create"/>
<label>First uid (inclusive) <input type="text" name="firstUid"/></label>
<label>Last uid (inclusive) <input type="text" name="lastUid"/></label>
<label>Condition Order<input type="text" name="conditionOrder"/></label>
</form>
<hr/>
{% endblock %}
如果我什么都不做,一切都会正确显示,但是如果没有自定义视图,我就无法处理自定义表单。当我向我的 SiteAdmin
添加 get_urls()
和自定义视图时,应该允许我处理自定义表单,但只显示 'after_field_sets' 块。
这是我的站点模型管理员:
class SiteAdmin(admin.ModelAdmin):
fields = ['experiment', 'name', 'description']
readonly_fields = ['experiment']
inlines = [ParticipantInline]
def get_urls(self):
urls = super(SiteAdmin, self).get_urls()
my_urls = [
url(r"^(?P<pk>[0-9]+)/$", self.admin_site.admin_view(self.my_view,
cacheable=True)),
]
return my_urls + urls
def my_view(self, request):
context = dict(
self.admin_site.each_context(request),
opts = Site._meta,
change = True,
is_popup=False,
save_as=False,
has_delete_permission=False,
has_add_permission=False,
has_change_permission=False
)
if request.method == 'POST':
action = request.POST["action"]
firstUID = request.POST["firstUid"]
lastUID = request.POST["lastUid"]
if "create" == action:
for uid in range(firstUID, lastUID+1):
Participant.objects.create(site=site, uid=uid)
return TemplateResponse(request, "admin/experimentAdmin/site/change_form.html", context)
是否需要将更多信息传递给上下文才能显示整个表单?
如有任何帮助,我们将不胜感激。
事实证明,更好的方法是不是覆盖change_form.html模板,而是为我的网站创建一个ModelForm
模型,我在其中定义了一些额外的字段(不是实际模型的一部分),在这些字段上设置 required=False,将它们添加到 ModelAdmin 的字段集中,并在我的 SiteAdmin::save_model()
[=13= 中处理可选的额外表单字段]
class SiteForm(forms.ModelForm):
first_uid = forms.IntegerField(label='First UID', required=False)
last_uid = forms.IntegerField(label='Last UID', required=False)
conditions_order = forms.CharField(label='Conditions Order', required=False)
class Meta:
model = Site
fields = ("name", "description",
"first_uid", "last_uid", "conditions_order")
class SiteAdmin(admin.ModelAdmin):
form = SiteForm
inlines = [ParticipantInline]
fieldsets = (
(None, {
"fields": ("name", "description")
}),
("Bulk Create Participants", {
"fields": ("first_uid", "last_uid",
"conditions_order")
})
)
def save_model(self, request, obj, form, change):
# deal with optional fields if present
...
obj.save()
我有以下3个模型,每个都和它的children
有一对多的关系* Experiment
* Site (lab, schools, etc.)
* Participants
由于一个站点可能有数百名参与者,我已经覆盖了它的模型 change_form.html,我在 'after_field_sets' 块中添加了一个 'bulk create' 表单。
这是我的 my-project/templates/admin/my-app/site/change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block after_field_sets %}
{{ block.super }}
<h3>Bulk Create Participants</h3>
<form method="POST">
<input type="hidden" name="action" value="create"/>
<label>First uid (inclusive) <input type="text" name="firstUid"/></label>
<label>Last uid (inclusive) <input type="text" name="lastUid"/></label>
<label>Condition Order<input type="text" name="conditionOrder"/></label>
</form>
<hr/>
{% endblock %}
如果我什么都不做,一切都会正确显示,但是如果没有自定义视图,我就无法处理自定义表单。当我向我的 SiteAdmin
添加 get_urls()
和自定义视图时,应该允许我处理自定义表单,但只显示 'after_field_sets' 块。
这是我的站点模型管理员:
class SiteAdmin(admin.ModelAdmin):
fields = ['experiment', 'name', 'description']
readonly_fields = ['experiment']
inlines = [ParticipantInline]
def get_urls(self):
urls = super(SiteAdmin, self).get_urls()
my_urls = [
url(r"^(?P<pk>[0-9]+)/$", self.admin_site.admin_view(self.my_view,
cacheable=True)),
]
return my_urls + urls
def my_view(self, request):
context = dict(
self.admin_site.each_context(request),
opts = Site._meta,
change = True,
is_popup=False,
save_as=False,
has_delete_permission=False,
has_add_permission=False,
has_change_permission=False
)
if request.method == 'POST':
action = request.POST["action"]
firstUID = request.POST["firstUid"]
lastUID = request.POST["lastUid"]
if "create" == action:
for uid in range(firstUID, lastUID+1):
Participant.objects.create(site=site, uid=uid)
return TemplateResponse(request, "admin/experimentAdmin/site/change_form.html", context)
是否需要将更多信息传递给上下文才能显示整个表单?
如有任何帮助,我们将不胜感激。
事实证明,更好的方法是不是覆盖change_form.html模板,而是为我的网站创建一个ModelForm
模型,我在其中定义了一些额外的字段(不是实际模型的一部分),在这些字段上设置 required=False,将它们添加到 ModelAdmin 的字段集中,并在我的 SiteAdmin::save_model()
[=13= 中处理可选的额外表单字段]
class SiteForm(forms.ModelForm):
first_uid = forms.IntegerField(label='First UID', required=False)
last_uid = forms.IntegerField(label='Last UID', required=False)
conditions_order = forms.CharField(label='Conditions Order', required=False)
class Meta:
model = Site
fields = ("name", "description",
"first_uid", "last_uid", "conditions_order")
class SiteAdmin(admin.ModelAdmin):
form = SiteForm
inlines = [ParticipantInline]
fieldsets = (
(None, {
"fields": ("name", "description")
}),
("Bulk Create Participants", {
"fields": ("first_uid", "last_uid",
"conditions_order")
})
)
def save_model(self, request, obj, form, change):
# deal with optional fields if present
...
obj.save()