Как визуализировать формы django modelformset_factory вручную

Я использую форму django modelformset_factory для загрузки и редактирования изображений. В настоящее время, когда я отображаю формы, они показывают формы с существующими данными следующим образом:

  • имя поля: В настоящее время: ссылка на изображение (например: images / filename.jpg)
  • Изменение: поле ввода изображения
  • флажок для удаления

Как я могу изменить отображение (в настоящее время: ссылка на изображение (например: images / filename.jpg))? хотел бы изменить ссылку на изображение, чтобы вместо этого отображалось имя изображения и открывать его в новом окне, когда пользователь щелкает по нему. Я проверил документацию django, чтобы вручную отобразить форму, но не смог найти соответствующую информацию.

Спасибо!

Модели:

class BaseImageAbstractModel(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type','object_id')

    class Meta:
        abstract = True

class ImageAbstractModel(BaseImageAbstractModel):
        user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
        name = models.CharField(max_length=50, blank=True)
        description = models.TextField(max_length=3000)
        picture = models.ImageField(upload_to='images')
        submit_date = models.DateTimeField(default=None)
        is_public = models.BooleanField(default=True)
        is_removed = models.BooleanField(default=False)

        class Meta:
            abstract = True

        def __str__(self):
            pass

class Image(ImageAbstractModel):    
    class Meta:
        verbose_name = "Image"
        verbose_name_plural = "Images"

        def __str__(self):
            return self.name
class ImageForm(BootstrapForm, ModelForm):

    class Meta:
        model = Image
        fields = ('picture', 'name')

ImgFormSet = modelformset_factory(Image, form=ImageForm, extra=5, can_delete=True)

person RL Shyam    schedule 18.01.2017    source источник
comment
Не могли бы вы опубликовать свою соответствующую модель?   -  person Edwin Lunando    schedule 18.01.2017


Ответы (1)


Решение состоит в том, чтобы создать подкласс класса ClearableFileInput и переопределить следующее:

class image_widget(ClearableFileInput):
     initial_text = ugettext_lazy('')
     template_with_initial = ('%(initial_text)s <a target="_blank" href="%(initial_url)s">%(initial)s</a> '
    '%(clear_template)s<br />%(input_text)s: %(input)s')

    def get_template_substitution_values(self, value):
       return {
           'initial': 'Current Picture',
           'initial_url': conditional_escape(value.url),
    }

class ImageForm(BootstrapForm, ModelForm):

    class Meta:
        model = Image
        fields = ('picture', 'name')
        widgets = {'picture': image_widget,}

Теперь результат выглядит следующим образом:

  • Имя поля: Текущее изображение
  • Изменение: поле ввода изображения
  • Установите флажок для удаления

Справочная документация по Django

person RL Shyam    schedule 23.01.2017