django 从管理面板上传的图像未显示在主页中

问题描述 投票:0回答:1

我创建了一个 django 项目来从用户界面和管理面板上传图像。但是当从用户界面上传图像时,图像不会上传到媒体文件夹,也不会显示在主页中。但是从管理面板上传时,图像会正确上传到媒体文件夹,但在主页中不会显示图像。这个问题仅与图像有关。其他字段都正确显示,例如标题、价格等。告诉我如何解决我的问题。这些是我的代码片段。 用户界面上传代码

      <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)

和模型.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>

所以请解决这个问题

我想从用户界面正确上传图像,并且我想在主页中显示图像

python django image upload
1个回答
0
投票

因为您分配的属性在您的视图中不存在:

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>
...

除此之外,请确保您正在提供静态文件

© www.soinside.com 2019 - 2024. All rights reserved.