Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加新的额外数据时获取django ChildInline父模型字段值_Python_Django_Django Admin - Fatal编程技术网

Python 添加新的额外数据时获取django ChildInline父模型字段值

Python 添加新的额外数据时获取django ChildInline父模型字段值,python,django,django-admin,Python,Django,Django Admin,作为实现我的目标的另一种方法,如所述:,即:将动态默认字段值设置为内联的“localwant”子字段,该子字段等于其父级等效的“remotewant” 我有以下两种型号: #models.py class Parent(models.Model): id = UUIDField(primary_key=True) remotewanted = models.CharField(max_length=100) class Child(models.Model

作为实现我的目标的另一种方法,如所述:,即:将动态默认字段值设置为内联的“localwant”子字段,该子字段等于其父级等效的“remotewant”

我有以下两种型号:

#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
如果我希望local默认为“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”

但是 如果希望此默认值是动态的(即父变量),请使用self.instance.parent\u remotewant替换“AAA”,如下所示(在子窗体类中):

它什么也不显示

然后 尝试直接处理Parent.objects,我的第二次尝试与其他方法相同:

两者都显示“匹配查询不存在”,DEBUG=TEMPLATE\u DEBUG=True。 我开始意识到ChildForminit函数的确切功能。而且它似乎处理的是要实现的结构,而不是有效的目标

问题 从这里有什么事要做吗?
我的方法是死路一条吗?

实例。父标识是一个函数,所以您必须实际调用它

def __init__(self, *args, **kwargs):
    super(ChildForm, self).__init__(*args, **kwargs)
    self.initial['localwanted']   = self.instance.parent_identity()  #<----------------
def\uuuu init\uuuu(self,*args,**kwargs):
super(子窗体,self)。\uuuuuu初始化(*args,**kwargs)

self.initial['localwanted']=self.instance.parent_identity()#谢谢。是的,它是一个函数,但现在不必调用它,因为父类此时没有实例化。我改变了我的视角,并以不同的方式进行了操作,正如这里所解释的:为了仅在实例化类对象时调用可调用对象,
@property
装饰器是我的解决方案。
#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  #<----------------
>>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__)
def __init__(self, *args, **kwargs):
    super(ChildForm, self).__init__(*args, **kwargs)
    self.initial['localwanted']   = self.instance.parent_identity()  #<----------------