无法在list_editable中列出所有字段而不报错

11 投票
3 回答
3828 浏览
提问于 2025-04-17 20:51

我想用 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',)
    ...

撰写回答