显示不打算在 ModelAdmin 中编辑的字段

时间:2021-02-04 19:09:34

标签: django wagtail wagtail-admin

我有一个自定义联系表单,我使用 sent_time 为其创建了一个 auto_now_add 字段,以节省用户发送消息的时间。

我能够在管理面板的列表视图中列出所有信息,但是当我尝试输入特定消息时,我遇到了以下错误:

'sent_time' cannot be specified for GeneralContact model form as it is a non-editable field

我尝试将 ModelAdmin 中的字段设为只读导致了同样的错误

class GeneralContactAdmin(ModelAdmin):
    """
    Admin model for general correspondence via
    the main contact form on the information page
    """

    model = GeneralContact
    list_display = GeneralContact.__all__
    search_fields = GeneralContact.__all__
    readonly_fields = GeneralContact.__all__
    ordering = ('-sent_time',)
    list_filter = ('sent_time', 'has_response')

当然可以只显示,也许我在模型中做错了什么?

这是我用于联系模型的基本模型

class ContactFormBase(models.Model):

    __all__ = (
        'sent_time', 'sender_name', 'sender_email',
        'sender_message', 'has_response', 'responded_on'
    )

    sent_time = models.DateTimeField(auto_now_add=True)
    sender_name = models.CharField()
    sender_email = models.EmailField()
    sender_message = models.TextField()
    has_response = models.BooleanField(
        default=False,
        help_text='Select whether this message has been replied to by an admin.',
    )
    responded_on = models.DateTimeField(blank=True, null=True)

    panels = [
        FieldRowPanel([
            FieldPanel('sender_name'),
            FieldPanel('sender_email'),
        ]),
        FieldPanel('sent_time'),
        FieldPanel('sender_message'),
        FieldRowPanel([
            FieldPanel('has_response'),
            FieldPanel('responded_on'),
        ])
    ]

    class Meta:
        abstract = True
        ordering = ['-sent_time',]

实际使用的类相当简单,也许需要在这里做些什么来允许显示只读字段?

class GeneralContact(ContactFormBase, models.Model):

    panels = ContactFormBase.panels

    class Meta:
        verbose_name = 'General Contact Entry'
        verbose_name_plural = 'General Contact Entries'

在列表视图中可以显示所有信息。在编辑视图中,理想情况下,有关消息和发件人的所有信息都将作为只读字段,并且管理员可以根据是否有人响应来更改 has_response 值。

我可以通过什么方式实现这一目标?


更新

看到 this Q&A 后,我已将 auto_now_add 更改为使用 django.utils.timezone.now 作为 sent_time 属性的默认值,并且生活似乎更好了,从问题开始的错误消失了,编辑视图完全加载。但是,现在所有字段都是可编辑的,这是不可取的。

查看 Wagtail 提供的 ModelAdmin 类,似乎 readonly_fields 不可用,并且可能只是同名 django 管理类的一个功能。所以我不确定在这里做什么。 Wagtails HelpPanel 类型的输出是我正在寻找的,我有一个想法用它来显示数据,但我不确定它是什么样子,甚至我不确定它是如何完成的我只是在学习 django 和 wagtail。


更新 2

尝试使用 HelpPanel 而不是 FieldPanel 以尝试显示值,但似乎 HelpPanel 没有检索属性值。检查 these docs 我看到没有提到像 djangos readonly_field 这样的东西,这证实了为什么我以前的一次尝试没有奏效,但我确实发现提到了 inspect_view_enabled ,它显示了这些值以只读方式,在尝试之后,它看起来非常像我试图获得它的方式,唉,没有任何可编辑的东西是有意义的,但我越来越接近了。

我想知道是否有一个好的解决方案是覆盖用于 GeneralContactAdmin 的视图或模板,但不确定这是否只是为一个类输出一些文本的正确方法。

一个更简单的解决方案是保留检查视图,只将 has_response 添加到编辑视图,但是两个视图,其中一个只是一个复选框,对 UX 来说并不好。

当然有更好的方法来解决这个问题吗?

0 个答案:

没有答案
相关问题