django 模型管理员添加表单卡住了

hel*_*pse 4 python django admin

考虑这个

@admin.register(Personal, site=admin_site)
class PersonalAdmin(admin.ModelAdmin):
    form = ChangePersonalForm
    add_form = AddPersonalForm

    def get_form(self, request, obj=None, **kwargs):
        if not obj:
            self.form = self.add_form

        return super(PersonalAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

第一次尝试creatingchanging对象时,它会正常工作。但是,在create对象之后,每次尝试change对象时,您都会得到add_form而不是form

我通过添加一个 else 块来解决这个问题

@admin.register(Personal, site=admin_site)
class PersonalAdmin(admin.ModelAdmin):
    change_form = ChangePersonalForm
    add_form = AddPersonalForm

    def get_form(self, request, obj=None, **kwargs):
        if not obj:
            self.form = self.add_form
        else:
            self.form = self.change_form

        return super(PersonalAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

好像有某种class缓存。

有谁知道为什么?

小智 6

Django 中的一切都是模板。将自定义表单分配给管理站点表单时,不仅会更改 django 接收数据的功能,而且还会更改每个请求中使用的模板,因此在第一次创建和更新时就可以了,但是一旦你分配了自定义表单,默认情况下将其用于表单的操作。有必要考虑这两种情况,因此有必要重新分配您正在使用的默认模板(表单),而不是保留在以前的模板(add_form)中。这在内部执行 Django。参考https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1006

注意:如果您使用自定义表单,请不要使用“表单”变量来重新分配自定义表单,而是使用 change_form

@admin.register(Personal, site=admin_site)
class PersonalAdmin(admin.ModelAdmin):
    change_form = ChangePersonalForm
    add_form = AddPersonalForm

    def get_form(self, request, obj=None, **kwargs):
        if not obj:
            self.form = self.add_form
        else:
            self.form = self.change_form

        return super(PersonalAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)