Django UpdateView подгрузить старые изображения в форму и вывести на страницу, новые фото отображаю через js
Подскажите пожалуйста как подгрузить старые изображения в форму и вывести на страницу
Views
model = Card
form_class = CardProductUpdateForm
template_name = 'ads/card_product_update.html'
def form_valid(self, form):
self.object = form.save(commit=False)
card_slug = str(self.object.slug) + str(randint(1, 1000000))
self.object.slug = slugify(card_slug)
self.object.id_user = self.request.user
self.object.save()
for key in form.files:
img_files = form.files.getlist(key)
if img_files:
for file in img_files:
CardPhoto.objects.create(card_img=file, id_card=self.object)
else:
raise ValidationError("Загрузите минимум 1 фото")
return super().form_valid(form)
Form
photos = forms.ImageField(label=u'Фотографии', widget=forms.FileInput(attrs={'multiple': 'multiple'}),
validators=[max_file_size])
class Meta:
model = Card
fields = ('title', 'price', 'condition', 'description', 'photos')
Model
CHOICES_CONDITION = (
('Новое', 'Новое'),
('Б\у', 'Б\у')
)
title = models.CharField(max_length=25, verbose_name='Название')
slug = models.SlugField(unique=True, db_index=True, verbose_name='URL')
price = models.IntegerField(verbose_name='Цена')
id_category = models.ForeignKey(
Category,
on_delete=models.CASCADE,
related_name='category_card',
verbose_name='Категория',
default=None
)
id_user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='user_card',
verbose_name='Пользователь',
default=None
)
condition = models.CharField(max_length=50, verbose_name='Состояние',
choices=CHOICES_CONDITION, default=CHOICES_CONDITION[0][0])
description = models.TextField(blank=True, verbose_name='Описание')
date_add = models.DateTimeField(auto_now_add=True, verbose_name='Дата добавления')
is_deleted = models.BooleanField(default=False, verbose_name='Удалить')
def get_absolute_url(self):
return reverse('card', kwargs={'category': self.id_category.slug, 'slug': self.slug})
class Meta:
unique_together = [['id_user', 'slug']]
verbose_name = 'Объявление'
verbose_name_plural = 'Объявления'
ordering = ['-date_add']
def __str__(self):
return self.slug
class CardPhoto(models.Model):
card_img = models.ImageField(upload_to=upload_images,
verbose_name='Фотографии', blank=True, null=True, validators=[max_file_size])
id_card = models.ForeignKey('Card', on_delete=models.CASCADE, related_name='photos')
class Meta:
verbose_name = 'Фотографии'
verbose_name_plural = 'Фотографии'
def __str__(self):
return f"{self.id_card.slug}"
html
<div class="content100-form">
<span class="login100-form-title p-b-35 p-t-35">
Редактирование
</span>
<form action="{{ objects.get_absolute_url }}" enctype="multipart/form-data" method="post">
{% csrf_token %}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-error">
{{ error|escape }}
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div class="alert alert-error">
{{ error|escape }}
</div>
{% endfor %}
{% endif %}
<div class="wrap-input100 m-b-23">
<span class="label-input100" style="font-size: 16px">Название <span class="asteriskField">*</span></span>
{% render_field form.title class="input100" placeholder="Введите название" %}
<span class="focus-input100" data-symbol=""></span>
</div>
<div class="wrap-input100 m-b-23">
<span class="label-input100" style="font-size: 16px">Цена <span class="asteriskField">*</span></span>
{% render_field form.price class="input100" placeholder="Введите цену" %}
<span class="focus-input100" data-symbol=""></span>
</div>
<div class="wrap-input100 m-b-23">
<div class="label-input100 m-b-23" style="font-size: 16px">Состояние <span class="asteriskField">*</span></div>
{% render_field form.condition class="input100" %}
</div>
{{ form.description|as_crispy_field }}
<div class="m-b-23 m-t-23">
<div class="m-b-10" style="font-size: 16px">Фотографии (не более 6 фото) <span class="asteriskField">* </span></div>
<div class="files_style m-b-10">
{% render_field form.photos id="fln" name="files[]" %}
</div>
<div id="list"></div>
</div>
<div class="container-login100-form-btn">
<div class="wrap-login100-form-btn">
<div class="login100-form-bgbtn"></div>
<button type="submit" class="login100-form-btn" name="btnformlogin">
Обновить
</button>
</div>
</div>
</form>
</div>
JS
var showFile = (function () {
var fr = new FileReader,
i = 0,
files, file;
fr.onload = function (e) {
var li;
if (file.type.match('image.*') && document.getElementById("fln").files.length < 7) {
li = document.createElement('li');
if (file.size > (5 * 1024 * 1024)) {
li.innerHTML = "<div class='del-photos'><div style='width: 100px; height: 100px; class='card'><div class='alert-error card'>Размер фото превышает 5 мб</div></div><div class='del-photo-btn'><button class='delb' type='button'><i class='fa fa-trash-o'></i>Удалить</button></div></div>";
} else {
li.innerHTML = "<div class='del-photos'><img class='card' src='" + e.target.result + "' style='width: 100px; height: 100px;'><div class='del-photo-btn'><button class='delb' type='button'><i class='fa fa-trash-o'></i>Удалить</button></div></div>";
}
document.getElementById('list').appendChild(li);
}
file = files[++i];
if (file) {
fr.readAsDataURL(file)
} else {
i = 0;
}
}
return function (e) {
files = e.target.files;
file = files[i];
if (files) {
while (i < files.length && !file.type.match('image.*')) {
file = files[++i];
}
if (file) fr.readAsDataURL(files[i])
}
}
})()
$( document ).on('click', '.del-photo-btn', function() {
$(this).parent().parent().remove();
return false;
})
if (document.getElementById('fln')) {
document.getElementById('fln').addEventListener('change', showFile, false);
}