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 вне своих поисковых запросов.