Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在Django上使用modelformset_工厂进行更新_Python 3.x_Django - Fatal编程技术网

Python 3.x 如何在Django上使用modelformset_工厂进行更新

Python 3.x 如何在Django上使用modelformset_工厂进行更新,python-3.x,django,Python 3.x,Django,我使用modelformset_factory方法进行多次照片上传。但当我想更新帖子时,我不知道怎么做,我尝试了一些东西,但这只会重新上传照片,然后再次上传上传照片。如何更新或删除以前上传的照片?此外,我无法以{{formset.image}的形式访问formset中的照片。我怎样才能访问这个 Views.py def post_update(request, slug): post = get_object_or_404(Post, slug=slug) if not requ

我使用modelformset_factory方法进行多次照片上传。但当我想更新帖子时,我不知道怎么做,我尝试了一些东西,但这只会重新上传照片,然后再次上传上传照片。如何更新或删除以前上传的照片?此外,我无法以{{formset.image}的形式访问formset中的照片。我怎样才能访问这个

Views.py

def post_update(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if not request.user.is_authenticated and not request.user == post.seller or not request.user.is_admin:
        raise Http404
    ImageFormSet = modelformset_factory(PostImage, form=PostImageForm, extra=5, can_delete = True)
    form = PostForm(data=request.POST or None, instance = post, files = request.FILES or None)
    
    formset = ImageFormSet(data=request.POST or None, files= request.FILES or None, queryset=PostImage.objects.filter(post__slug=slug))
    if form.is_valid():
        if formset.is_valid():
            for forms in formset.cleaned_data:
                if forms:
                    image = forms['image']
                    print(forms['image'])
                    photo = PostImage(post=post, image=image)
                    photo.save()
        form.save(commit=True)
        messages.success(request,"Success")
        return HttpResponseRedirect(reverse('gayrimenkul:detail',kwargs={'slug':form.instance.slug}))
    return render(request,'post_update.html',{'form':form,'formset':formset,'slug':slug})
post_update.html

{% extends "main_page.html" %}
{% load static %}
{% block icerik %}
{% load crispy_forms_tags %}
<div class="row">
<div class="container">

    <h2 class="page_header">İlan Ver</h2>
    <hr>
    {% if form.errors %}
        {{form.errors}}
    {% endif %}
    <div class="col-md-12">
        <form enctype="multipart/form-data" method="POST">
            {% csrf_token %}
            {{form.media}}
            {{form|crispy}}
            <div class="row">
            <div class="col-md-6">
            {{formset}}
            </div>
            <div class="col-md-6">
            <button type="submit" id="inp" class="btn btn-outline-primary" style="float:right;">Kaydet</button>
            </div>
            </div>
        </form>
    </div>
</div>
</div>
 {% endblock %}

在检查表单是否有效之前,只需过滤表单集的模型

     data = PostImage.objects.filter(post=post)
为从表单0开始的表单集项目提供项目索引,(f)项目本身,如果id的项目没有更改,则保存以前的项目本身,否则使用更新的新图像更改数据库图像

            if formset.is_valid():
                for index, f in enumerate(formset):
                    if f.cleaned_data:
                        if f.cleaned_data['id'] is None:
                            pic = PostImage(post=post, image=f.cleaned_data.get('image')) 
                            pic.save()

                    elif f.cleaned.data['image'] is False:
                       pic = PostImage.objects.get(id = request.POST.get('form-' + str(index) + '-id'))
                       pic.delete()
                        
                        else:
                            pic = PostImage(post=post, image=f.cleaned_data.get('image'))
        
                            d = PostImage.objects.get(id=data[index].id) #get slide id which was uploaded
                            d.image = pic.image # changing the database title with new title
                         
                            d.save()

这可能会对您有用或让您有所了解。

谢谢。它的工作:)但我仍然不能删除上传的照片:)我已经编辑了我的帖子,我已经添加了删除图像的elif声明。希望这能有所帮助。在这里,我通过获取输入标记的名称来删除字段。你可以检查一下田地,自己看看。我找到了
elif.cleaned.data['image']为False:
应为
elif request.POST.get('form-'+str(index)+'-DELETE')!=无:
            if formset.is_valid():
                for index, f in enumerate(formset):
                    if f.cleaned_data:
                        if f.cleaned_data['id'] is None:
                            pic = PostImage(post=post, image=f.cleaned_data.get('image')) 
                            pic.save()

                    elif f.cleaned.data['image'] is False:
                       pic = PostImage.objects.get(id = request.POST.get('form-' + str(index) + '-id'))
                       pic.delete()
                        
                        else:
                            pic = PostImage(post=post, image=f.cleaned_data.get('image'))
        
                            d = PostImage.objects.get(id=data[index].id) #get slide id which was uploaded
                            d.image = pic.image # changing the database title with new title
                         
                            d.save()