Templates django管理模型,覆盖的change\u form.html缺少上下文

Templates django管理模型,覆盖的change\u form.html缺少上下文,templates,django-admin,customization,Templates,Django Admin,Customization,我有以下3个模型,每一个模型都与它的孩子有一对多的关系 * Experiment * Site (lab, schools, etc.) * Participants 因为一个站点可能有数百名参与者,所以我覆盖了它的models change\u form.html,在“after\u field\u set”块中添加了一个“bulk create”表单 以下是我的项目/模板/管理员/我的应用程序/网站/更改表单.html: {% extends "admin/change_fo

我有以下3个模型,每一个模型都与它的孩子有一对多的关系

* Experiment
  * Site (lab, schools, etc.)
     * Participants
因为一个站点可能有数百名参与者,所以我覆盖了它的models change\u form.html,在“after\u field\u set”块中添加了一个“bulk create”表单

以下是我的项目/模板/管理员/我的应用程序/网站/更改表单.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 %}
是否需要向上下文传递更多信息以显示整个表单


任何帮助都将不胜感激。

事实证明,更好的方法是不要覆盖change\u form.html模板,而是为我的站点模型创建一个
ModelForm
,在这里我定义了一些额外的字段(不是实际模型的一部分),在这些字段上设置required=False,将它们添加到ModelAdmin的字段集中,并在my
SiteAdmin::save_model()

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)
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()