Как отобразить файл img в шаблоне django? - PullRequest
0 голосов
/ 27 марта 2020

Я знаю, что название немного вводит в заблуждение, но я все объясняю. Я нахожусь в процессе создания магазина в django, и есть небольшая проблема, которую я не знаю, как обойти. Ну, для каждого продукта я хочу назначить несколько фотографий, которые я сохраняю в базе данных. Вот почему я создал модель Photo, которая связана с моделью Book с помощью ForeignKey.

. Вся проблема в том, что я не знаю, как указать на домашней странице магазина одну из фотографии, назначенные определенной c книге. Конечно, на странице много книг, сгенерированных в for loop.

. Если это полезно, я сохраняю изображения для каждой книги в отдельной папке, за которую отвечает функция content_file_name. что

Конечно, я открыт для других идей для достижения такого эффекта, как описано выше. Я не уверен, что выбранный мной путь оптимален.

#models.py

def content_file_name(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (instance.book.slug, ext)
    return os.path.join('books_img', instance.book.slug, filename)


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=300)
    publisher = models.CharField(max_length=100)
    price = models.FloatField()
    slug = models.SlugField()
    seller = models.ForeignKey(User, on_delete=models.CASCADE)


class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    file = models.ImageField(default=random_img, upload_to=content_file_name)
    uploaded_at = models.DateTimeField(auto_now_add=True)

1 Ответ

0 голосов
/ 27 марта 2020

Это на самом деле проблема отношений, а не проблема кодирования. Давайте углубимся в это

Это короткая версия вашего Book класса для иллюстрации.

class Book(models.Model):
    pass

Это короткая версия вашего Photo класса для иллюстрации.

class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    file = models.ImageField(default=random_img, upload_to=content_file_name)

Что такое ForiegnKey? - ForiegnKey - это просто причудливое название для ManyToOne, верно? Сколько здесь и сколько?

Что ж, у нас есть книга с несколькими фотографиями. Таким образом, фотография имеет Key, как ключ от двери, Она открывает ТОЛЬКО это дверь, Это Key.

В вашем Photo классе есть переменная класса, которая называется book. Называть это будет как Photo.book. Однако, поскольку действует django, вызов обратного отношения будет book.photo_qs, где photo_qs - имя по умолчанию для обратных отношений.

Давайте его улучшим.

class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='photos')
    file = models.ImageField(default=random_img, upload_to=content_file_name)

Теперь, как и прежде, это все еще photo.book, но book.photos (от связанного имени)

В Engli sh, каждый экземпляр книги имеет .photos (связанного типа менеджера). Поэтому, если вы получите книгу типа

my_book = Book.objects.all()[0]

В этой книге есть фотографии типа (Related Manager), ее использование будет похоже на

my_book.photos.all()

Пока все в порядке, теперь проблема означает, что вы хотите отправить изображение с информацией о книге в шаблоне,

Ваш просмотр

def my_view(request):
    my_book = Book.objects.all()[0] # first book
    return render(request, 'my_template_path', context= {
        'my_book': my_book,
        })

Теперь ваш шаблон имеет доступ к переменной my_book.

в вашем шаблоне

{% for photo in my_book.photos.all %}
        <img src="{{ photo.file.url }}">
{% endfor %}

Редактируйте в соответствии с вашими потребностями.

...