我创建了一个 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>
所以请解决这个问题
我想从用户界面正确上传图像,并且我想在主页中显示图像
因为您分配的属性在您的视图中不存在:
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>
...
除此之外,请确保您正在提供静态文件。