Python Django Admin未保存保留在初始状态的预填充内联字段

Python Django Admin未保存保留在初始状态的预填充内联字段,python,django,django-admin,Python,Django,Django Admin,我有一些自定义管理代码,它初始化了一些内联子对象 如果用户编辑内联子对象的默认值之一,则在保存父对象时将创建该子元素 我假设Django正在检查值是否已从其初始值更改,并且仅当用户更改了值时才进行保存 是这样吗 如果用户选择不更改默认值,如何强制Django Admin创建默认值不变的内联子对象 class PrepopIpInlineFormSet(forms.models.BaseInlineFormSet): model = Ip def __init__(self, *

我有一些自定义管理代码,它初始化了一些内联子对象

如果用户编辑内联子对象的默认值之一,则在保存父对象时将创建该子元素

我假设Django正在检查值是否已从其
初始值更改,并且仅当用户更改了值时才进行保存

是这样吗

如果用户选择不更改默认值,如何强制Django Admin创建默认值不变的内联子对象

class PrepopIpInlineFormSet(forms.models.BaseInlineFormSet):
    model = Ip

    def __init__(self, *args, **kwargs):
        super(PrepopIpInlineFormSet, self).__init__(*args, **kwargs)
        initial = # calculate a set of default Ip model initial values
        self.initial = initial


class PrepopIpInline(admin.options.InlineModelAdmin):
    template = "admin/linked.html"
    model = Ip
    formset = PrepopIpInlineFormSet
    fk_name = 'sim'
    admin_model_path = None
    show_url = True

    def __init__(self, *args):
        super(PrepopIpInline, self).__init__(*args)
        if self.admin_model_path is None:
            self.admin_model_path = self.model.__name__.lower()

    def get_formset(self, request, obj=None, **kwargs):
        formset = super(PrepopIpInline, self).get_formset(request, obj, **kwargs)
        formset.request = request
        return formset

    def get_extra(self, request, obj=None, **kwargs):
        if obj:
            return 0
        else:
            return ApnGgsn.objects.all().count()
来源:


在ModelAdmin对象本身中,可以使用与save_相关的方法。然后,一旦完成,检查这些模型是否存在。如果它们不存在,就创建它们。它看起来像这样:

class ParentObjectAdmin(admin.ModelAdmin):
  def save_related(self, request, form, formsets, change):
    super(ParentObjectAdmin, self).save_related(request, form, formsets, change)
    obj = form.instance
    if form.is_valid() and not ChildObject.objects.filter(parent = obj).exists():
      ChildObject.objects.create(name = ChildObject.default_name, parent = obj, ...)
完全公开:我不记得(对于新创建的ParentObject)是否会填充form.instance属性。我知道基础对象将在此时创建(因为save_模型是在save_相关之前调用的)

如果我对“obj=form.instance”的建议不起作用,您也可以通过基于表单数据中的唯一值进行查询来获取新对象

例如,不使用obj=form.instance,而是执行以下操作:

obj = ParentObject.objects.get(username = form.cleaned_data.get("username"))
obj = ParentObject.objects.get(username = form.cleaned_data.get("username"))