首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DJANGO保存Formset

在DJANGO保存Formset
EN

Stack Overflow用户
提问于 2017-08-03 22:13:51
回答 1查看 2.8K关注 0票数 0

我从模型中获得了一个表单集,但是当我试图保存多个格式化集时,我会得到以下错误:

KeyError at /auditoria/auditoria_tab/ 'id_control‘

我的看法是:

代码语言:javascript
复制
@staff_member_required
def AuditoriaView(request):
   class RequiredFormset(BaseFormSet):
      def __init__(self,*args,**kwargs):
         super(RequiredFormset,self).__init__(*args,**kwargs)
         for form in self.forms:
            form.empty_permitted =  False

   auditoriaFormset = formset_factory(AuditoriaForm,max_num=31,formset=RequiredFormset)

   if request.method == 'POST':
      usuario = request.user
      accion = 'Registro nuevo Detalle de Auditoria'
      formset  = auditoriaFormset(request.POST)
      for form in formset.forms:
         if formset.is_valid():
            obj = form.save(commit=False)
            #obj.id_control = control
            obj.auditor = request.user
            obj.save()
   else:
      formset = auditoriaFormset()

   return render_to_response('audit_auditoria.html',
                              {'formset':formset},
                              context_instance=RequestContext(request))

我的表格:

代码语言:javascript
复制
class AuditoriaForm(forms.ModelForm):
   id_control = forms.ModelChoiceField(queryset=Control.objects.all().order_by('nombre'),\
                                       required=True,label='Control', widget=forms.Select(attrs={'class':'form-control'}))
   id_analista = UserModelNameChoiceField(queryset=User.objects.filter(is_staff=False),\
                                          required = True, label='Analista', widget=forms.Select(attrs={'class':'form-control'}))
   fecha = forms.DateField(widget=DateInputCustom())
   id_tipoerror = forms.ModelChoiceField(queryset=TipoError.objects.all(),required=True, label='Tipo Falla', widget=forms.Select(attrs={'class':'form-control'}))
   id_sharepoint = forms.IntegerField(label='Sharepoint', widget=forms.NumberInput(attrs={'class':'form-control','style': 'width:80px'}))
   id_estado = forms.ModelChoiceField(queryset=Estado.objects.all(),required=True, label='Estado', widget=forms.Select(attrs={'class':'form-control'}))
   observaciones = forms.CharField(widget=forms.Textarea(attrs={'rows':5,'cols':30}))

   class Meta:
      model = DetalleAuditoria
      exclude = ('auditor',)

   def __init__(self,*args,**kwargs):
      super(AuditoriaForm,self).__init__(*args,**kwargs)
      self.helper = FormHelper(self)

   def clean(self):
      cleaned_data = super(AuditoriaForm,self).clean()
      idc = cleaned_data['id_control']
      fechac = cleaned_data['fecha']

      try:
         DetalleAuditoria.objects.get(id_control = idc,fecha = fechac )
         raise forms.ValidationError('Esta Incidencia ya ha sido registrada')
      except DetalleAuditoria.DoesNotExist:
         pass

      return cleaned_data

模板:

代码语言:javascript
复制
<form id="form_audit" class="form" method="post" action="/auditoria/auditoria_tab/">
            <table class="table table-responsive table-condensed table-bordered">
              {{ formset.management_form }}
                {% for form in formset.forms %}
               <thead>
                <th class="info"colspan="6">
                  <label >{{ form.id_control.label|capfirst }} </label>
                  {{ form.id_control }}
                </th>
               </thead>
               <thead>
               <th>{{ form.id_analista.label|capfirst }}</th>
               <th>{{ form.id_sharepoint.label|capfirst }}</th>
               <th>{{ form.fecha.label|capfirst }}</th>
               <th>{{ form.id_tipoerror.label|capfirst }}</th>
               <th>{{ form.id_estado.label|capfirst }}</th>
               <th>{{ form.observaciones.label|capfirst }}</th>
              <thead>
              <tbody>
              <tr class="{% cycle row1,row2 %} formset_row">
               <td>{{ form.id_analista }}</td>
               <td>{{ form.id_sharepoint }}</td>
               <td>{{ form.fecha }}</td>
               <td>{{ form.id_tipoerror }}</td>
               <td>{{ form.id_estado }}</td>
               <td>{{ form.observaciones }}</td>
              </tr>
               {% endfor %}
              </tbody>
            </table>
              <input type="submit" class="btn btn-info" value="Registrar">
            </form>

{% block extra_js %}
<script src="{{STATIC_URL|default:"/static/"}}admin/js/jquery.formset.js"></script>

<script type="text/javascript">

   function renewDatePickers() {
    $('.datepicker').datepicker('destroy');
    $('.datepicker').datepicker({
        format: "yyyy-mm-dd",
        startDate: "2014-01-01",
        endDate: "2020-01-01",
        autoclose: true
    });
   }

   $(renewDatePickers);

    $('.formset_row').formset({
        addText: 'Agregar Detalle Auditoria',
        deleteText: 'Eliminar',
        prefix: '{{ formset.prefix }}',
        added: renewDatePickers
    });

</script>

{% endblock extra_js %}

当我想保存数据时,如何使用来自其他窗体集中的第一个格式化集的字段ID_CONTROL。

我不知道我是否正确地使用了格式集?

任何建议

提前谢谢

更新:我得到了“干净”函数中的错误。当视图试图保存第二种格式集时,在下面的行中出现了以下错误:

代码语言:javascript
复制
  idc = cleaned_data['id_control']

在错误页面中,我可以看到post,我可以看到第一个格式集的id_control值,但是对于第二个格式集,我看到了除id_control以外的所有字段。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-09 10:30:36

在我看来,以这种方式将相同的控制id放入下一种形式似乎是不明智的。无论如何,要解决您所要求的问题,这应该是有效的(具有不同的“what”值的表单):

代码语言:javascript
复制
   id_control=None
   if request.method == 'POST':
      usuario = request.user
      accion = 'Registro nuevo Detalle de Auditoria'
      formset  = auditoriaFormset(request.POST)

      for counter, form in enumerate(formset.forms):
         if formset.is_valid():
            obj = form.save(commit=False)
            if counter>0:
                obj.id_control = id_control
            obj.auditor = request.user
            obj.save()
            if counter==0:
                id_control=obj.id_control
   else:
      formset = auditoriaFormset()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45495368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档