向ClusterableModel添加一个InlineField不需要n

2024-04-19 09:00:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为EventDetail的Page类,它依次保存了多条消息(通过cronjob发送)。如以下文档所示: https://docs.wagtail.io/en/v2.5.1/reference/pages/panels.html?highlight=available%20panel%20types#inline-panels

问题是,我还希望能够附加几个文件到每个消息。但是现在我不再上网页课了,我不能让它工作了。我在其他论坛的帖子上读到,可以通过将应该容纳InlinePanel的模型制作成ClusterableModel来实现这一点,但是我不能让它工作。进行此操作时,我在访问页面时得到以下信息:

FieldError at /admin/message/eventdetailmessage/create/
Unknown field(s) (files) specified for EventDetailMessage

我的代码:

class Message(models.Model):
"""
    An abstract model of messages connected to an eventdetail
"""

title = models.CharField(max_length=255, blank=True)
content = models.TextField()
send_time = models.DateTimeField(verbose_name=_("Message send time"))
sent = models.BooleanField(default=False)

@property
def edit_link(self):
    return self.url_helper.get_action_url("edit", self.id)

@property
def delete_link(self):
    return self.url_helper.get_action_url("delete", self.id)

@property
def create_link(self):
    return f"{self.url_helper.get_action_url('create')}?id={self.event_detail.id}"

panels = [FieldPanel("title"), FieldPanel("content"), FieldPanel("send_time")]

class Meta:
    abstract = True

class EventDetailMessage(ClusterableModel, Orderable, Message):
"""
    The actual implementation. Done like this in case we want do use
    wagtails built in functionality for creating on the fly. 
"""

event_detail = ParentalKey(
    EventDetail, on_delete=models.CASCADE, related_name="messages"
)

panels = [FieldPanel("event_detail"), InlinePanel("files")] + Message.panels

def __init__(self, *args, **kwargs):
    from .wagtail_hooks import MessageDataAdmin

    self.url_helper = MessageDataAdmin().url_helper
    super().__init__(*args, **kwargs)

def __str__(self):
    return self.title


class File(models.Model):
    file = models.FileField()
    message = ParentalKey(
        EventDetailMessage, on_delete=models.CASCADE, related_name="files"
    )

    panels = [FieldPanel("file")]

Tags: selfhelperidurlmessagereturnmodelsdef
1条回答
网友
1楼 · 发布于 2024-04-19 09:00:55

我找到了!File类下的ParentalKey定义需要用引号来定义,否则它不起作用,应该是这样的:

message = ParentalKey(
    "message.EventDetailMessage", on_delete=models.CASCADE, related_name="files"
)

但是我仍然不确定为什么会这样,有人能解释一下吗?你知道吗

相关问题 更多 >