0

我有一个使用 Django Wagtail 的简单片段。我希望能够从“CreateView”更新徽标,但是当它在我的视图中呈现时,它需要一个外键。我想创建一个 from 来做到这一点很容易,但事实并非如此。

@register_snippet
class MerchantSnippet(models.Model):
    
    name = models.CharField(max_length=255, blank=False, null=False, unique=True)
    logo = models.ForeignKey(
                    'wagtailimages.Image',
                    null=True,
                    blank=True,
                    on_delete=models.SET_NULL,
                    )

    def __str__(self):
        return '{} {}'.format(self.user.first_name, self.user.last_name)

    panels =[
        FieldPanel('name'),
        ImageChooserPanel('logo'),
   ]

   edit_handler = TabbedInterface([
       ObjectList(panels, heading='Content'),
       ])



class ProductCreateView(CreateView):
    model = ProductSnippet
    fields = ['name','logo']

 class ProductUpdateView(UpdateView):
    model = ProductSnippet
    fields = ['name','logo']

当我在模板中使用默认示例时,我最终只得到了一个下拉菜单。

 {% render_field field class+="form-control" %}

如果我正在更新片段并能够上传不同的片段,我如何能够看到图像预览。如果我正在创建一个新项目,则可以选择上传图像。

4

1 回答 1

1

logo字段是一个外键,指向 Wagtail Image。因此它是一个选择。如果您将该logo字段更改为ImageField,您可能会获得您想要的行为。但是,上传的徽标不会出现在 Wagtail 图像中。那不是坏事。每当您想显示徽标时,只需使用商家代码段即可。

如果必须将徽标存储为 Wagtail 图像,则有两种选择:

备选方案 1:自定义表单

CreateView并且UpdateView是 Django 通用视图并继承FormMixin。这意味着您可以指定自定义form_class. 在提交时使用和创建自定义表单logo = ImageField(...),处理图像数据,创建 Wagtail 图像,并将 Wagtail 图像 pk 存储在片段上。

备选方案 2:多种形式

Django 可以在一个带有前缀的表单标签内处理多个表单,以避免字段名称冲突。因此,您可以在同一视图中同时呈现片段和 Wagtail 图像。

注意:@register_snippetWagtail 需要显示 CRUD 视图并在 Wagtail 管理界面中启用片段选择器。但是一个片段是一个常规的 Django 模型。Wagtail Image 也是一个常规的 Django 模型。表单和通用视图也是纯 Django 概念。如果您再深入研究一下,请将 Wagtail 排除在搜索查询之外。

于 2021-12-21T00:10:00.890 回答