Как я могу "обрезать" ненужные поля ввода из GenericView?
В моем текущем проекте я создаю небольшую CMS, чтобы клиент мог обновлять свою галерею на сайте новыми изображениями и заменять старые. Для этого я использую общие представления, чтобы упростить весь процесс.
Добавление нового изображения не было проблемой, но UpdateView предоставляет некоторые html элементы, которые я не хочу, чтобы видел мой клиент:
Вот код:
models.py
class GalleryPicture(models.Model):
title = models.CharField(max_length=200)
img = WEBPField(
verbose_name=_('Image'),
upload_to=image_folder,
null=True,
blank=True,
)
def __str__(self):
return f'{self.title}'
def get_absolute_url(self):
return reverse('Galerie Überblick')
class Meta:
verbose_name_plural = 'GalleryPictures'
Я также использую пользовательское поле для изображений, поэтому все загруженные изображения будут автоматически преобразованы в формат WEBP:
fields.py
class WEBPFieldFile(ImageFieldFile):
def save(self, name, content, save=True):
content.file.seek(0)
image = Image.open(content.file)
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
super().save(name, image_content_file, save)
class WEBPField(models.ImageField):
attr_class = WEBPFieldFile
urls.py
path('content-manager/overview/gallery/<int:pk>/edit', EditGalleryImage.as_view(), name="Bild ändern")
views.py
class EditGalleryImage(UpdateView):
model = GalleryPicture
template_name = './pages/content_edit/edit_gallery_image.html'
fields = ['title', 'img',]
edit_gallery_image.html
<div class="form-content">
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<input class="submit-button link-button" type="submit" value="Speichern" name="save-image">
<input class="submit-button link-button" type="submit" value="Löschen" name="delete-image">
</form>
</div>
Мой первый подход заключался в создании пользовательской модели формы в forms.py и определении там некоторых классов для этих html элементов, чтобы я мог скрыть их с помощью JS:
forms.py
class UpdateImageForm(forms.ModelForm):
class Meta:
model = GalleryPicture
fields = ('title', 'img')
widgets = {
'img': forms.ImageField(
widget=forms.FileInput(attrs={'class': 'nice'})
),
}
Но если я буду использовать свой views.py вот так:
class EditGalleryImage(UpdateView):
model = GalleryPicture
template_name = './pages/content_edit/edit_gallery_image.html'
form_class = UpdateImageForm
Я получаю ошибку:
AttributeError at /content-manager/overview/gallery/1/edit
'ImageField' object has no attribute 'is_hidden'
и исправления, которые я нашел для этой ошибки, также не помогли в моем случае.
Возможно, кто-то из вас знает лучший подход для "обрезки" этих элементов HTML или знает, как решить эту ошибку? Я буду очень благодарен за любой ответ.
Используйте Django crispy forms, чтобы сделать его презентабельным. Я предполагаю, что они также предоставят вам возможность более тонкого контроля над тем, что отображается в форме.
