Загруженные в django изображения из панели администратора не отображаются на главной странице

я создал проект django для загрузки изображений как из пользовательского интерфейса, так и из панели администратора. но при загрузке изображений из пользовательского интерфейса, изображения не загружаются в папку media. и также не отображаются на главной странице. но при загрузке из панели администратора, изображения загружаются в папку media правильно, но на главной странице изображения не отображаются. эта проблема только с изображениями. другие поля отображаются правильно, как название, цена и так далее. подскажите, как решить мою проблему. вот мои фрагменты кода. пользовательский интерфейс загрузка кода

      <div class="layout__body">
        <form
          class="form"
          action=""
          method="POST"
          enctype="multipart/form-data"
        >
          {% csrf_token %}

          <div class="form__group">
            <label for="post_category">Enter a Category</label>
            <input
              required
              type="text"
              value="{{post.category.name}}"
              name="category"
              list="category-list"
            />
            <datalist id="category-list">
              <select id="post_category">
                {% for category in categories %}
                <option value="{{category.name}}">{{category.name}}</option>
                {% endfor %}
              </select>
            </datalist>
          </div>

          <div class="form__group">
            <label for="post_name">Post Title</label>
            {{form.title}}
          </div>

          <div class="form__group">
            <label for="post_image">Post Image</label>
            {{form.image}}
          </div>

          <div class="form__group">
            <label for="post_price">Post Price</label>
            {{form.price}}
          </div>

          <div class="form__action">
            <a class="btn btn--dark" href="{{request.META.HTTP_REFERER}}"
              >Cancel</a
            >
            <button class="btn btn--main" type="submit">Submit</button>
          </div>
        </form>

views.py для создания постов

@staff_member_required
@login_required(login_url='login')
def create_post(request):
    form = PostForm(request.POST,request.FILES)
    categories = Category.objects.all()
    if request.method == 'POST':
        category_name = request.POST.get('category')
        category,created_at = Category.objects.get_or_create(name = category_name)
        
        Post.objects.create(
            host=request.user,
            category=category,
            title=request.POST.get('title'),
            image=request.FILES.get('post_image'),
            price = request.POST.get('price')
        )
        print(request.FILES)
        return redirect('home')

    context = {'form': form, 'categories': categories}
    return render(request, 'base/post_form.html', context)

и models.py

def post_image_path(instance, filename):
    # Customize the upload path for posts based on the posting admin's username and category
    if instance.host and instance.category:
        # Create a folder based on the posting admin's username
        username_folder = instance.host.username
        # Create a subfolder based on the category name
        category_folder = instance.category.name.replace(' ', '_').lower()
    else:
        username_folder = 'unknown_user'
        category_folder = 'uncategorized'

    # Construct the full upload path
    upload_path = os.path.join('uploads', 'posts', username_folder, category_folder, filename)
    print("Upload path: ",upload_path)
    return upload_path


class Post(models.Model):
    host = models.ForeignKey(User,on_delete=models.SET_NULL, null=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL,null=True)
    participants = models.ManyToManyField(User, related_name='participants',blank=True)
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to=post_image_path)  # Adjust upload path as needed
    price = models.DecimalField(max_digits=10, decimal_places=2)
    # content = models.TextField()  # Add content field for post body
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)  # Auto-populate creation date

    total_likes = models.IntegerField(default=0)
    
    class Meta:
        ordering = ['-updated_at','-created_at']

    def __str__(self):
        return self.title

и на главной странице для отображения изображений

        <div>
          <a href="{% url 'post' post.pk %}">
            <img
              src="{{ post.post_image.url }}"
              alt="{{ post.title }}"
              class="responsive-img"
            />
          </a>
        </div>

        <div class="Post">
          <a
            href="{% url 'user-profile' post.host.id %}"
            class="roomListRoom__author"
          >
            <div class="avatar avatar--small">
              <img src="{{post.host.avatar.url}}" />
            </div>
            <span>@{{post.host.username}}</span>
          </a>
        </div>

        <div>
          <span class="price"><br />ETB {{ post.price }}</span>
        </div>

поэтому, пожалуйста, исправьте эту проблему

я хочу корректно загружать изображения из пользовательского интерфейса и отображать их на главной странице

Потому что вы назначаете атрибут, который не существует в вашем представлении:

def create_post(request):
        ...
        Post.objects.create(
            # image=request.FILES.get('post_image')
            image=request.FILES.get('image'),
        )
        ...
    return render(request, 'base/post_form.html', context)

А также вызов неправильного поля в вашем шаблоне:

...
<a href="">
  <img
    src="{{ post.image.url }}"
    alt="{{ post.title }}"
    class="responsive-img"
  />
</a>
...

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

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