[英]How do I access images uploaded through a formset in Django?
I cannot seem to find a way to iterate through the files uploaded by the formset, although the files are uploaded as the code indicates. 我似乎找不到一种方法来遍历表单集上载的文件,尽管文件已按照代码指示进行了上载。
When I load the page it shows 1-3 "img src=(unkown)" tags. 当我加载页面时,它显示1-3个“ img src =(unkown)”标签。 It shows 3 when I upload 2 images and 1 when I upload 1 image.
上传2张图片时显示3,上传1张图片时显示1。
Template view-post: 模板视图:
{% block body %}
<div class="container">
<div class="col-md-8">
<p>
<h1>{{ post.title }}</h1>
<h4>{{ post.body }}</h4>
<p>
Posted by {{ post.user }} on {{ post.created_date }}
{% if not post.created_date == post.updated_date %}
and updated on {{ post.updated_date }}
{% endif %}
</p>
</p>
{% for img in images %}
<img src="{{ img.url }}" width=360>
{{ img.url }}
<br>
{% endfor %}
</div>
<div class="col-4-md">
{% if post.cover_image %}
<img src="{{ post.cover_image.url }}" width=240>
{% endif %}
</div>
</div>
{% endblock %}
Here I use filter, not get, so it should give me a list of the images connected via foreignkey to the right post. 在这里,我使用过滤器而不是获取,因此它应该给我列出通过Foreignkey连接到正确帖子的图像列表。 The post here is displayed as it should be, along with the internal cover image and text in the post.
此处的帖子将按原样显示,并附带帖子中的内部封面图像和文字。
View view-post: 查看观点:
class ViewPost(TemplateView):
template_name = 'posts/view_post.html'
context_object_name = 'view_post'
def get(self, request, pk):
post = Post.objects.get(pk=pk)
images = Images.objects.filter(post=post)
args = {'post': post, 'images': images}
return render(request, self.template_name, args)
Template make-post: 模板制作:
{% block body %}
<div class="container">
<div class="col-md-8">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
{{ form.errors }}
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form }}
{% endfor %}
<button type="submit">Submit</button>
</form>
</div>
</div>
{% endblock %}
View make-post: 查看制作发布:
class MakePost(DetailView):
template_name = 'posts/make_post.html'
ImageFormSet = modelformset_factory(Images, form=ImageForm, extra=3)
def get(self, request):
form = PostForm()
formset = self.ImageFormSet(queryset=Images.objects.none())
args = {'form': form, 'formset': formset}
return render(request, self.template_name, args)
def post(self, request):
form = PostForm(request.POST, request.FILES)
formset = self.ImageFormSet(request.POST, request.FILES,
queryset=Images.objects.none())
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.cover_image = form.cleaned_data['cover_image']
post.title = form.cleaned_data['title']
post.body = form.cleaned_data['body']
post.save()
for imgform in formset:
image = imgform.cleaned_data.get('image')
photo = Images(post=post, post_image=image)
photo.save()
return redirect('home_space:home')
else:
return redirect('home_space:home')
Function to name files and image Model: 命名文件和图像模型的功能:
def get_image_filename(instance, filename):
title = instance.post.title
slug = slugify(title)
return "post_images/%s-%s" % (slug, filename)
class Images(models.Model):
post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
post_image = models.ImageField(upload_to=get_image_filename,
verbose_name='Image')
In your template, you are accessing url
of Images
model instance. 在您的模板中,您正在访问
Images
模型实例的url
。 But, the url
property is in ImageField
class instance. 但是,
url
属性位于ImageField
类实例中。 Use img.post_image.url
. 使用
img.post_image.url
。
Example : 范例 :
{% for img in images %}
<img src="{{ img.post_image.url }}" width=360>
{{ img.post_image.url }}
<br>
{% endfor %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.