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/