【问题标题】:How to prevent creating new object for existing ones when editing in inlineformset?在 inlineformset 中编辑时如何防止为现有对象创建新对象?
【发布时间】:2020-01-09 21:06:57
【问题描述】:

在内联表单集中编辑记录时,提交后还会为现有对象创建新对象(重复)。如何防止这种情况?

我删除了模型中的所有对象,并在检查 is_valid() 后重新插入。一切正常,但媒体文件没有得到保存。

views.py

def edit_frm(request,id):
    ob = DynamicMain.objects.get(id=id)
    if request.method == 'POST':
        formsety = DocumentsUploadFormset(request.POST,request.FILES, prefix='formsety')
        formsetz = DocumentsDownloadFormset(request.POST,request.FILES, prefix='formsetz')
        if formsety.is_valid() and formsetz.is_valid():

            del_up_ob = DocumentsUpload.objects.filter(title=ob).delete() #delete all objects
            del_dwn_ob = DocumentsDownload.objects.filter(title=ob).delete()
            for i in formsety:
                name = i.cleaned_data.get('name')
                mandatory = i.cleaned_data.get('mandatory')
                types_doc = i.cleaned_data.get('types_doc')
                location = i.cleaned_data.get('location')
                DocumentsUpload(
                    title=ob,
                    name=name,
                    mandatory=mandatory,
                    types_doc=types_doc,
                    location=location,
                ).save()
            for i in formsetz:
                name = i.cleaned_data.get('name')
                mandatory = i.cleaned_data.get('mandatory')
                types_doc = i.cleaned_data.get('types_doc')
                location = i.cleaned_data.get('location')
                DocumentsDownload(
                    title=ob,
                    name=name,
                    mandatory=mandatory,
                    types_doc=types_doc,
                    location=location,
                ).save()
        return redirect('app-admin:home')
    uploadformset = inlineformset_factory(DynamicMain, 
    DocumentsUpload,extra=0,fields=('name','mandatory'))
    downloadformset = inlineformset_factory(DynamicMain, 
    DocumentsDownload,extra=0, fields=('name','mandatory','types_doc'))
    formsety = uploadformset(prefix='formsety',instance=ob)
    formsetz = downloadformset(prefix='formsetz',instance=ob) 
    context = {
       'formsety' : formsety,
       'formsetz' : formsetz,
    }
    return render(request,'app/edit_form.html', context)

edit_form.html

    <h3>Upload</h3>
    <br>
    <div class="content formElements add_item_container six formsety hide_add_button">
        <table cellpadding="0" cellspacing="0" class="table">
            <tr>
                <th>Name</th>
                <th>Mandatory</th>
            </tr>
            {% for f in formsety.forms %}
            <tr class="form_up">
                <td>
                    <span class="p5name1">
                        {{ f.name }}
                    </span>
                </td>
                <td>
                    <span class="p5name1">
                        {{ f.mandatory }}
                    </span>
                </td>
                <td>{% if f.instance.pk %}{{ f.DELETE }}{% endif %}</td>
            </tr>
        {% endfor %}
        </table>
        {{ formsety.management_form }}
        </div>

    <hr> -->

     <h3>Download</h3>
    <hr>
    <br>
    <div class="content formElements add_item_container six formsetz hide_add_button">
        <table cellpadding="0" cellspacing="0" class="table">
            <tr>
                <th>Name</th>
                <th>Mandatory</th>
                <th>Type doc</th>
            </tr>
            {% for f in formsetz.forms %}
            <tr class="form_dwn">
                <td>
                    <span class="p5name1">
                        {{ f.name }}
                    </span>
                </td>
                <td>
                    <span class="p5name1">
                        {{ f.mandatory }}
                    </span>
                </td>
                <td>
                    <span class="p5name1">
                        {{ f.types_doc }}
                    </span>
                </td>

                <td>{% if f.instance.pk %}{{ f.DELETE }}{% endif %}</td>
            </tr>
        {% endfor %}
        </table>
        {{ formsetz.management_form }}
        </div> 

       <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
       <script type="text/javascript" src="{% static 'admin/js/jquery.formset.js' %}"></script>
      <script src="{% static 'admin/js/custom.min.js' %}"></script>
      <script type="text/javascript">

      $(document).ready(function(){
           $('.formsetx table tr.form_set_rowp5').formset({
                prefix: '{{ formsetx.prefix }}',
                formCssClass: 'dynamic-formset1',
           });  
      })
      $(document).ready(function(){
          $('.formsety table tr.form_up').formset({
                 prefix: '{{ formsety.prefix }}',
                 formCssClass: 'dynamic-formset1',
            }); 
      })
      $(document).ready(function(){
           $('.formsetz table tr.form_dwn').formset({
                prefix: '{{ formsetz.prefix }}',
                formCssClass: 'dynamic-formset1',
            }); 
      })
     </script>

我想更新数据而不创建现有数据的副本。

【问题讨论】:

  • 你可以像他们在这里提到的那样将一个实例传递给表单集:(stackoverflow.com/questions/11666035/…)
  • 现在我收到一个错误,__init__() 得到了一个意外的关键字参数 'instance'。
  • 好的,请发布整个错误 Traceback 以及您在问题中创建的 formsets
  • 感谢@SammyJ 现在它的工作。感谢您的帮助。

标签: django inline-formset django-2.1


【解决方案1】:

您可能需要在此处添加实例:

formsety = DocumentsUploadFormset(request.POST,request.FILES, prefix='formsety', instance = ob)
formsetz = DocumentsDownloadFormset(request.POST,request.FILES, prefix='formsetz', instance = ob)

【讨论】:

  • 我试过但得到一个错误,__init__() 得到了一个意外的关键字参数 'instance'
猜你喜欢
  • 2015-05-09
  • 2015-06-27
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多