python - Django 如何在 django-admin 中将 <bound method ... >> 对象显示为字符串对象?

标签 python django django-admin

Django 如何翻译这个 <bound method Child.parent_identity of <Child: >>对象在字符串对象中,并在我的 django-admin“内联”子类 idparent 字段中显示它? Django 是做什么的?

我有以下应用程序结构:

##========================models.py
...
from django_extensions.db.fields import UUIDField

class Parent(models.Model):
    id           = UUIDField(primary_key=True)

class Child(models.Model):
    parent      = models.ForeignKey(Parent)
    idparent    = 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)
        #print self.instance.parent_identity
        self.initial['idparent']   = self.instance.parent_identity        

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)

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

print self.instance.parent_identity
#it prints  : <bound method Child.parent_identity of <Child: >>

但是如何显式打印字符串内容,如下

>>print self.instance.parent_identity
#would print  : fffeee29-7ac6-42eb-8a8d-eb212d2365ff

即如何获取它以便在ChildForm类中进行处理?

更新

我并不特别介意“尚未创建实例时表单中的 UUID” 我不想自己提供初始值。

我希望我的仍然为空(额外)的子字段(示例代码中的一个字段:idparent)默认包含父变量。

可能吗?

最佳答案

Django 模板自动调用任何可调用的对象;例如callable() function当您传入对象时返回 True。来自 Variables section in the template documentation :

If the resulting value is callable, it is called with no arguments. The result of the call becomes the template value.

绑定(bind)方法是可调用的,因此模板不使用 self.instance.parent_identity,而是使用 self.instance.parent_identity() 的输出。

在您自己的代码中,您通常已经知道某个东西是一个方法,并且显式调用它:

def __init__(self, *args, **kwargs):
    super(ChildForm, self).__init__(*args, **kwargs)
    self.initial['idparent']   = self.instance.parent_identity()

您可以将 parent_identity 方法视为属性;让 Python 自动调用它,而无需您显式调用它。如果您永远不需要传递参数,那么这可能是有意义的。您可以通过使用 @property decorator 修饰该方法来完成此操作。 :

class Child(models.Model):
    parent      = models.ForeignKey(Parent)
    idparent    = models.CharField(max_length=100)

    @property
    def parent_identity(self):
        return self.parent_id

此时self.instance.parent_identity将为您提供该方法的返回值。

考虑到 UUIDField 仅在 pre-save 上被赋予值。 ;在将对象保存到数据库中之前,它将为None

如果您确实想在实例尚未创建时在表单中使用 UUID,则必须自己提供初始值:

import uuid 

class ParentAdmin(admin.ModelAdmin):
    exclude = []
    inlines = [ChildInline]

    def __init__(self, *args, **kwargs):
        super(ParentAdmin, self).__init__(*args, **kwargs)
        self.fields['id'].initial = uuid.uuid4

关于python - Django 如何在 django-admin 中将 <bound method ... >> 对象显示为字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26973926/

相关文章:

django - 在Django中引用多个提交按钮

javascript - Django,角色匹配查询不存在

django - manage.py - 不在项目文件夹中?

Django 管理页面布局随新版本而更改

python - 在 Django 管理站点中显示 ManyToMany 对象的字段名称而不是整个对象

python - U-SQL Python 扩展 DataFrame 列格式

python - Pandas 无法拆分多个星号

python - 从 IDE 下载时的不同 PyCharm 版本

python - 在所有管理页面中将模型字段设置为只读

python - 可调用实例参数的表示法是什么?