无法在list_editable中列出所有字段而不报错
我想用 list_editable
让我的所有字段在同一页面上都可以编辑。但是如果我没有在 list_display_links
中放一些东西,就会出现错误。问题是我没有多余的字段可以放在那里。我可能在某个地方误解了一个概念。
我做的事情是,在模型中创建了一个“虚拟”字段: dummy = None
。这不仅显得笨拙,而且可能是错误的——而且还导致这个虚拟字段出现在我的管理界面中。
我到底哪里做错了?我试着阅读文档,但找不到解决我问题的方法。我想以“正确的方式”来处理这个问题,不管那是什么。
这是我的代码:
models.py
...
class Slider(models.Model):
slider_title = models.CharField(max_length=20)
slider_text = models.TextField(max_length=200)
slider_order = models.PositiveSmallIntegerField(
default=1, blank=True, null=True, choices=[(1, 'first'),
(2, 'middle'), (3, 'last')])
dummy = None
def clean(self):
validate_only_three_instances(self)
def __str__(self):
return self.slider_title
...
admin.py
...
class SliderAdmin(admin.ModelAdmin):
# remove "add" button
def has_add_permission(self, request):
return False
fieldsets = [
(None, {'fields': ['slider_title']}),
(None, {'fields': ['slider_text']}),
(None, {'fields': ['slider_order']}),
]
list_display = (
'slider_title', 'slider_text', 'slider_order', 'dummy',)
list_display_links = ('dummy',)
list_editable = ('slider_title', 'slider_text', 'slider_order',)
...
3 个回答
0
你最好在 admin.py
文件里创建一个虚拟列,像下面这样,而不是在 models.py
里创建一个虚拟字段,这样可以让 Django 管理后台里的所有列都可以编辑:
class SliderAdmin(admin.ModelAdmin):
# ...
list_display = (
'slider_title', 'slider_text', 'slider_order', 'dummy',)
list_display_links = ('dummy',)
list_editable = ('slider_title', 'slider_text', 'slider_order',)
@admin.display(description="") # Here
def dummy(self, obj):
return ""
你可以查看 我的帖子,里面有更多详细的解释。
1
你需要添加:
list_display_links = None
15
我现在明白了。虽然官方文档让我有点摸不着头脑,但读了这个之后我就明白了:
http://django-suit.readthedocs.org/en/latest/sortables.html
总结一下:
list_display
- 这个是用来决定在管理页面上显示哪些字段。
list_editable
- 这个是用来决定哪些字段可以直接在页面上编辑,而不需要进入“编辑”页面。你可以直接在页面上修改,挺方便的。
list_display_links
- 至少要有一个来自list_display
的项目作为链接,指向编辑页面。这个项目不能同时出现在list_editable
中,否则就不能作为链接了。(真是让人无奈)
这就是我最后修改文件的方式:
models.py
class Slider(models.Model):
...
link = "Edit"
...
admin.py
class SliderAdmin(admin.ModelAdmin):
...
list_display = (
'slider_title', 'slider_text', 'slider_order', 'link',)
list_display_links = ('link',)
list_editable = ('slider_title', 'slider_text', 'slider_order',)
...