【问题标题】:How can i update with modelformset_factory on Django如何在 Django 上使用 modelformset_factory 进行更新
【发布时间】:2020-07-15 20:11:19
【问题描述】:

我使用 modelformset_factory 方法上传多张照片。但是当我想更新帖子时,我不知道该怎么做,我尝试了一些方法,但这只是为了重新上传照片并再次上传上传的照片。如何更新或删除之前上传的照片?此外,我无法以 {{formset.image}} 的形式访问表单集中的照片。我怎样才能访问它?

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

创建帖子成功。

def post_create(request):
    if not request.user.is_authenticated:
        raise Http404
    ImageFormSet = modelformset_factory(PostImage, form=PostImageForm, extra=5)
    
    if request.method == 'POST':
        post_form = PostForm(request.POST, request.FILES)
        formset = ImageFormSet(request.POST, request.FILES, queryset=PostImage.objects.none())
        if post_form.is_valid():
            created_post = post_form.save(commit=False)
            created_post.seller = request.user
            created_post.save()
            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    photo = PostImage(post=created_post, image=image)
                    photo.save()
            messages.success(request,'Success')
            return HttpResponseRedirect(reverse('gayrimenkul:detail',kwargs={'slug':created_post.get_slug()}))
    else:
        post_form = PostForm()
        formset = ImageFormSet(queryset = PostImage.objects.none())
    return render(request,'post_create.html',{'form':post_form,'formset':formset})

【问题讨论】:

    标签: python-3.x django


    【解决方案1】:

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

         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 f.cleaned.data['image'] is False: 应该是 elif request.POST.get('form-'+str(index)+'-DELETE') != None:
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 2020-11-24
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多