Как я могу "обрезать" ненужные поля ввода из GenericView?

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

Добавление нового изображения не было проблемой, но UpdateView предоставляет некоторые html элементы, которые я не хочу, чтобы видел мой клиент:

enter image description here

Вот код:

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, чтобы сделать его презентабельным. Я предполагаю, что они также предоставят вам возможность более тонкого контроля над тем, что отображается в форме.

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