Wagtail Create Snippet из фронтенда для приема изображений (Django)

У меня есть простой сниппет, использующий 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" %}

Как я могу увидеть предварительный просмотр изображения в случае обновления сниппета и возможность загрузить другое изображение. В случае, если я создаю новый элемент, возможность выбрать и загрузить изображение.

Поле logo является внешним ключом и указывает на Wagtail Image. Поэтому оно является селектом. Если вы измените поле logo на ImageField, то, вероятно, получите желаемое поведение. Однако загруженные логотипы не будут отображаться в Wagtail Images. Это не плохо. Всякий раз, когда вы хотите отобразить логотип, вы просто используете сниппет Merchant.

Если хранение логотипа в виде изображения Wagtail является обязательным условием, есть две альтернативы:

Альтернатива 1: Пользовательская форма

CreateView и UpdateView являются общими представлениями Django и наследуют FormMixin. Это означает, что вы можете задать пользовательскую форму form_class. Создайте пользовательскую форму с logo = ImageField(...) и при отправке обработайте данные изображения, создайте Wagtail Image и сохраните Wagtail Image pk в сниппете.

Альтернатива 2: Множественные формы

Django может обрабатывать множество форм внутри одного тега формы с префиксом, чтобы избежать столкновения имен полей. Таким образом, вы можете представить и сниппет, и изображение Wagtail в одном представлении.

Примечание: @register_snippet необходим Wagtail для отображения CRUD представлений и включения выбора сниппетов в интерфейсе администратора Wagtail. Но сниппет - это обычная модель Django. Изображение Wagtail Image - это тоже обычная модель Django. Формы и общие представления также являются чистыми концепциями Django. Если вы погрузитесь в это еще немного, оставьте Wagtail вне своих поисковых запросов.

Вернуться на верх