Галерея в Джанго - PullRequest
       3

Галерея в Джанго

0 голосов
/ 05 октября 2019

У меня есть модель "Категория". Я хочу иметь его, поэтому каждый раз, когда я создаю категорию, он создает каталог в моей папке media. Оттуда я хочу иметь возможность загружать изображения в соответствующие папки и иметь галерею в моем представлении категорий, которая просматривает каждое изображение в указанном каталоге категорий.

category.html

<div class="container">
    <div class="row">
    {% for image in images %}
      <div class="col-md-4">
          <a href="/media/{{ image }}"> <img src="/media/{{ image }}" class="img-responsive img-thumbnail" width="304" height="236"/>
          </a>
       </div>
    {% endfor %}
    </div>
</div>

views.py

def category_detail_view(request, slug):
    try:
        category = Category.objects.get(slug=slug)
        images = os.listdir(settings.MEDIA_ROOT)
        context = {
            "images": images,
        }
    except Category.DoesNotExist:
        return HttpResponseNotFound()
    return render(request, 'main/category_detail.html', context)

models.py

class Category(models.Model):
    category_title = models.CharField(max_length=200)
    category_image = models.ImageField(upload_to="category")
    category_description = models.TextField()
    slug = models.SlugField(max_length=200, unique=True, default=1)

    class Meta:
        verbose_name_plural = "Categories"
        unique_together = ("category_title", "slug")

    def __str__(self):
        return self.category_title

Этот код работает, но только дляMEDIA_ROOT. Я хочу просмотреть текущую категорию

1 Ответ

1 голос
/ 13 октября 2019

Хорошо, давайте сделаем это на ваш взгляд


def category_detail_view(request, slug):
    category = get_object_or_404(Category, slug=slug)
    # Get the absolute path where the category images should be
    category_imgs_path = os.path.abspath(os.path.join(
        settings.MEDIA_ROOT,
        category.slug))
    # Check if the path exists, if not, create it
    if not os.path.isdir(category_imgs_path):
        os.mkdir(category_imgs_path)

    images = os.listdir(category_imgs_path)
    context = {
        "images": images,
    }
    return render(request, 'main/category_detail.html', context)

Может быть, лучше создать путь к изображениям категории, когда сама де Категория создается, а не просматривается. Вы не опубликовали код, в котором высоздайте экземпляр de Category, так что я сделал это, по вашему мнению, оно должно работать в любом случае.

Обратите внимание, что я добавил использование ярлыка get_object_or_404 django, чтобы избежать попытки / исключением, документы здесь ->https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/#get-object-or-404

Вам следует рассмотреть возможность фильтрации содержимого, указанного в images, чтобы убедиться, что в эту переменную входят только изображения, используя os.walk, glob или что-то подобное.

Надеется, что это удастсяЕсли нет, не стесняйтесь спрашивать об этом.


Если вы создаете свой экземпляр из интерфейса администратора

Поскольку вы создаете свойЭкземпляр из интерфейса администратора, вы можете создать путь, переопределяющий метод save_model в вашем ModelAdmin следующим образом:


class CategoryAdmin(ModelAdmin):
    (...)
    def save_model(self, request, obj, form, change):
        category_imgs_path = os.path.abspath(os.path.join(
            settings.MEDIA_ROOT,
            obj.slug))
        # Check if the path exists, if not, create it
        if not os.path.isdir(category_imgs_path):
            os.mkdir(category_imgs_path)

        super().save_model(request, obj, form, change)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...