Django 对带有@property的模型使用admin中的get_readonly_字段
我被以下事情弄糊涂了: models.pyDjango 对带有@property的模型使用admin中的get_readonly_字段,django,django-admin,Django,Django Admin,我被以下事情弄糊涂了: models.py class MyModel(models.Model): ... @property def xyz(self): return ... admin.py: class MyModelAdmin(admin.ModelAdmin): readonly_fields = ("xyz",) ... def get_readonly_fields(self, request, obj=None
class MyModel(models.Model):
...
@property
def xyz(self):
return ...
admin.py:
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ("xyz",)
...
def get_readonly_fields(self, request, obj=None):
""" As per http://stackoverflow.com/a/13818017/1149759 """
if <some condition>:
return [f.name for f in self.model._meta.fields]
return self.readonly_fields
我尝试重构模型和管理代码,使xyz()不是属性,但同样的错误也以同样的方式发生
甚至尝试单步执行内部Django代码。它在这一行失败了:
lib/python2.7/site-packages/django/contrib/admin/options.py(640)get_form()
-> return modelform_factory(self.model, **defaults)
{'fields': [..., 'xyz', ...],
'formfield_callback': <functools.partial object at 0x104a024c8>,
'form': <class 'django.forms.widgets.ModelForm'>,
'exclude': [<a long list of fields that does not include xyz>]}
前面的代码仍然抛出为xyz
指定的未知字段,以及模型上的以下两个字段
added = models.DateTimeField(auto_now_add=True, null=True, blank=True,)
last_updated = models.DateTimeField(auto_now=True, null=True, blank=True,)
属性与字段不同。您已将xyz定义为属性,Django管理员不支持该属性为可编辑。只有模型上的字段才能是管理员的readonly_fields属性的成员。您应该发现xyz不是self.model.\u meta.fields
的成员,因此get\u readonly\u fields
永远不会返回
您还应该包括readonly\u字段
或get\u readonly\u字段
看来,实现此功能的唯一方法是显式地将xyz
添加到只读字段列表中
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ("xyz", ...)
...
def get_readonly_fields(self, request, obj=None):
if <condition>:
ro = [f.name for f in self.model._meta.fields]
ro.append('xyz') # <=============
return ro
return self.readonly_fields
类MyModelAdmin(admin.ModelAdmin):
只读_字段=(“xyz”,…)
...
def get_readonly_字段(self、request、obj=None):
如果:
ro=[self.model.\u元字段中f的f.name]
ro.append('xyz')#感谢您的想法,尽管它们并没有导致解决方案。请参阅上面的更新。谢谢只想澄清一下-当您从get\u only\u字段返回[“added”]时,是否仍会收到错误?我只是想确保你没有混淆属性和字段。您应该能够在get\u readonly\u字段返回的列表中包含“added”或“last\u updated”。如果您仍然得到这些字段的错误,我可以为您进一步挖掘
added = models.DateTimeField(auto_now_add=True, null=True, blank=True,)
last_updated = models.DateTimeField(auto_now=True, null=True, blank=True,)
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ("xyz", ...)
...
def get_readonly_fields(self, request, obj=None):
if <condition>:
ro = [f.name for f in self.model._meta.fields]
ro.append('xyz') # <=============
return ro
return self.readonly_fields