添加新的额外内容时获取django ChildInline父模型字段值

时间:2014-11-17 12:01:03

标签: python django django-admin

作为达到我的目标的另一种方式,在那里描述:Get django default model field value to be a parent attribute value,即:将动态默认字段值设置为我的内联“localwanted”子字段,该字段等于其父等效“remotewanted”

我有以下两种模式:

#models.py
class Parent(models.Model):
    id           = UUIDField(primary_key=True)
    remotewanted = models.CharField(max_length=100)


class Child(models.Model):
    parent      = models.ForeignKey(Parent)
    localwanted = models.CharField(max_length=100)
    def parent_remotewanted(self):
        return self.parent.remotewanted

如果我希望localwanted默认为“AAA”:

#admin.py
class ChildForm(forms.ModelForm):
    class Meta:
        model   = Child
        exclude = []
    def __init__(self, *args, **kwargs):
        super(ChildForm, self).__init__(*args, **kwargs)
        self.initial['localwanted']   = "AAA"        

class ChildInline(admin.TabularInline):
    model = Child
    extra = 1
    form  = ChildForm

class ParentAdmin(admin.ModelAdmin):
    exclude = []
    inlines = [ChildInline]
    #list_display, etc
admin.site.register(Parent,ParentAdmin)

它有效,有额外的字段(这里只有一个)显示:“AAA”

BUT

如果希望此默认值为动态(即为父变量),则将self.instance.parent_remotewanted替换为“AAA”,如下所示(在ChildForm类中):

    ...
    self.initial['localwanted']   = self.instance.parent_remotewanted.__self__
    ...

它什么也没显示。

之后

尝试直接处理Parent.objects,我的第二次尝试 ceteris paribus

#models.py
class Child(models.Model):
    parent      = models.ForeignKey(Parent)
    localwanted = models.CharField(max_length=100)
    def parent_identity(self): #<----------------
        return self.parent_id  #<----------------

#admin.py
class ChildForm(forms.ModelForm):
    class Meta:
        model   = Child
        exclude = []
    def __init__(self, *args, **kwargs):
        super(ChildForm, self).__init__(*args, **kwargs)
        self.initial['localwanted']   = self.instance.parent_identity  #<----------------

我的内联字段正确显示父ID字段。作为一个新手,这对我来说很神奇,因为“self.instance.parent_identity”最初不是一个字符串对象。

>>print self.instance.parent_identity
<bound method Child.parent_identity of <Child: >> #<--what print function gives

无论如何,我相信我可以玩它,但不可能达到它的字符串表示,以便做类似的事情:

obj = Parent.objects.get(id=self.instance.parent_identity)
# or
obj = Parent.objects.get(id=self.instance.parent_identity.__self__)

两者都显示“匹配查询不存在”,DEBUG = TEMPLATE_DEBUG = True。 我开始意识到ChildForm init 函数的确切功能。它似乎与处理结构相比,不仅仅是有效的对象。

问题

这里有什么事吗? 我的方法是死路一条吗?

1 个答案:

答案 0 :(得分:0)

instance.parent_identity 是一个函数,因此您必须实际调用它。

def __init__(self, *args, **kwargs):
    super(ChildForm, self).__init__(*args, **kwargs)
    self.initial['localwanted']   = self.instance.parent_identity()  #<----------------
哎呀,这是一个老问题。