Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
Django 对带有@property的模型使用admin中的get_readonly_字段_Django_Django Admin - Fatal编程技术网

Django 对带有@property的模型使用admin中的get_readonly_字段

Django 对带有@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

我被以下事情弄糊涂了:

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):
        """ 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