簡體   English   中英

如何訪問通過Django中的表單集上傳的圖像?

[英]How do I access images uploaded through a formset in Django?

我似乎找不到一種方法來遍歷表單集上載的文件,盡管文件已按照代碼指示進行了上載。

當我加載頁面時,它顯示1-3個“ img src =(unkown)”標簽。 上傳2張圖片時顯示3,上傳1張圖片時顯示1。

模板視圖:

{% 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 %}

在這里,我使用過濾器而不是獲取,因此它應該給我列出通過Foreignkey連接到正確帖子的圖像列表。 此處的帖子將按原樣顯示,並附帶帖子中的內部封面圖像和文字。

查看觀點:

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)

模板制作:

{% 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 %}

查看制作發布:

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

命名文件和圖像模型的功能:

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

在您的模板中,您正在訪問Images模型實例的url 但是, url屬性位於ImageField類實例中。 使用img.post_image.url

范例

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM