Django 管理列表单击时更改布尔值

问题描述 投票:0回答:3

模型.py

class Event(models.Model):
    name = models.CharField(max_length=80, blank=False)
    description = models.TextField(blank=True)
    date = models.DateField(blank=True, null=True)
    locked = models.BooleanField(default=False)

管理员.py

class EventAdmin(admin.ModelAdmin):
   list_display = ('name', 'date', 'locked')
   search_fields = ['name']
  ordering = ['date']

admin.site.register(Event, EventAdmin)

是否可以通过单击管理列表中的图标来更改“锁定”?我尝试添加“list_editable = ['locked']”,但红色/绿色图标不可见。

感谢您的帮助:)

python django web admin
3个回答
4
投票

好的,我明白了。您可以这样做来使其发挥作用。

def is_locked(self, obj):
    yes_icon = '<img src="/static/admin/img/icon-yes.svg" alt="True">'
    no_icon = '<img src="/static/admin/img/icon-no.svg" alt="False">'

    obj.locked = not obj.locked
    obj.save()

    if obj.locked:
        return '<a href="">%s</a>' % yes_icon
    else:
        return '<a href="">%s</a>' % no_icon

is_locked.allow_tags = True
is_locked.short_description = 'Locked'

0
投票

默认情况下,在 Django 中,列表中的第一个名称将是点击的名称,因此您可以通过这种方式使用“锁定”。

list_display = ('locked', 'name', 'date')

或者,您可以在列表视图中使用自定义字段并在其中附加链接,如下所示:

class EventAdmin(admin.ModelAdmin):
    list_display = ('name', 'date', 'is_locked')
    search_fields = ('name',)
    ordering = ('date',)

    def is_locked(self, obj):
        yes_icon = '<img src="/static/admin/img/icon-yes.svg" alt="True">'
        no_icon = '<img src="/static/admin/img/icon-no.svg" alt="False">'
        if obj.is_tracer:
            return '<a target="_blank" href="%s/change/">%s</a>' % (obj.pk, yes_icon)
        else:
            return '<a target="_blank" href="%s/change/">%s</a>' % (obj.pk, no_icon)

    is_locked.allow_tags = True
    is_locked.short_description = 'Locked'

并在列表视图中添加:

list_display = ('name', 'date', 'is_locked')

0
投票

你可以使用

list_editable = ['locked']

将其显示为复选框并显示“保存”按钮!

© www.soinside.com 2019 - 2024. All rights reserved.