1

我有一个自定义联系表单,我为此创建了一个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根据是否有人响应来更改值。

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


更新

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

查看ModelAdminWagtail 提供的类,它似乎readonly_fields不可用,可能只是同名 django 管理类的一个功能。所以我不确定在这里做什么。WagtailsHelpPanel类型的输出是我正在寻找的,我有一个想法用它来显示数据,但我不确定它看起来像什么,甚至不确定它是如何完成的,因为我只是在学习 django 和鹡鸰。


更新 2

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

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

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

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

4

0 回答 0