Загруженные в 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>
...
Кроме того, убедитесь, что вы сохраняете свои статические файлы.