【问题标题】:Django serializeArray() from 2 django.form fields inside one form tag来自一个表单标签内的 2 个 django.form 字段的 Django serializeArray()
【发布时间】:2015-07-10 13:39:57
【问题描述】:

我有 2 个django.forms.ModelForms(detalle 和 camion),我需要将它们呈现在一个 <form> 标记中,然后使用 JavaScript 获取信息以将数据放入同一模板内的表格中。所以我的模板中有这样的东西。

<form id="agregar-servicio-form">

  <div class="row">
     <div class="col-md-3">
         {{ detalle_form.tipo | as_crispy_field }}
     </div>
     ...
  </div>
  <div class="row">
      <div class="col-md-3">
          {{ camion_form.modelo | as_crispy_field }}
      </div>
      <div class="col-md-3">
          {{ camion_form.capacidad | as_crispy_field }}
      </div>
         ...
  </div>

  </form>

我可以使用 serializeArray() 方法使用 javascript/jquery 获取所有表单数据,但是当我使用此表单 ($('#agregar-servicio-form').serializeArray();) 执行此操作时,捕获的数据仅来自 detalle_form 表单。

{'tipo':'123'} //in this example

如何从表单标签内的不同表单域中获取所有数据?即使有 2 个或更多 django ModelForms

【问题讨论】:

  • 要使用它,我需要更改我的字段名称,所以使用 django 会很头疼,我认为这不是一个好的选择,但还是谢谢

标签: javascript jquery python django forms


【解决方案1】:

来自http://django-crispy-forms.readthedocs.org/en/latest/form_helper.html

form_tag = 真

它指定是否应该呈现标签 使用布局时。如果设置为 False,它会呈现没有 标签。默认为真。

还可以阅读

disable_csrf = 假

这样你就可以声明基础助手类了:

class CommonFormHelper(FormHelper):
    def __init__(self):
        super(CommonFormHelper, self).__init__()
        self.disable_csrf = True
        self.form_tag = False

然后更新您的模型表单

class ModelFormOne(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.helper = CommonFormHelper()

        self.helper.layout = Layout(
            'someField1', 'someField2',
        )

        super(ModelFormOne, self).__init__(*args, **kwargs)

    class Meta:
        model = ModelOne

让我们看看模板:

<form method="post" enctype="multipart/form-data" class="mainForm">{% csrf_token %}
    {% crispy form_one form_one.helper %}
    {% crispy form_two form_two.helper %}

    <input class="btn btn-lg btn-success btn-submit center-block" type="submit" value="Save"/>
</form>

最后在您的视图中实现某种 Mixin 类,您可以将其作为超类添加到您的 Create 和 Update 视图中(它不是最后一个,您可以简单地复制粘贴,仅来自我的想法头,你应该完成它

class ObjectsAddEditMixin(object):
    def get(self, request, *args, **kwargs):
        pass

    def get_context_data(self, *args, **kwargs):
        pass

    def get_pks(self, **kwargs):
        self.pk1 = kwargs.get('pk1')
        self.pk2 = kwargs.get('pk2')

    def get_objects():
       self.objects = {}
       self.objects['form_one'] = get_object_ot_404(ModelOne, pk=self.pk1)
       self.objects['form_two'] = get_object_ot_404(ModelTwo, pk=self.pk2)

       return self.objects

    def post(self, request, *args, **kwargs):
        if self.pk_1 and self.pk_2:
            self.objects = self.get_objects()
            form_one = self.form_class_one(request.POST, request.FILES, instance=self.objects['form_one'])
            form_two = self.form_class_two(request.POST, request.FILES, instance=self.objects['form_two'])
        else:
            form_one = self.form_class(request.POST, request.FILES)
            form_two = self.form_class(request.POST, request.FILES)

        if form_one.is_valid() and form_two.is_valid():
            return self.form_valid(form_one, form_two)
        else:
            return self.form_invalid(form_one, form_two)

    def form_valid(self, form_one, form_two):
        form_one.save()
        form_two.save()

        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form_one, form_two):
        return self.render_to_response(
            self.get_context_data(
                form_one=form_one,
                form_two=form_two
            )
        )

    def get_success_url(self):
        return reverse('app:url_name')


class ObjectsCreateView(ObjectsAddEditMixin, View):
    def get_context_data(self, **kwargs):
        context = super(ObjectsCreateView, self).get_context_data(**kwargs)
        context['form_one'] = self.form_class_one(instance=ModelOne())
        context['form_two'] = self.form_class_two(instance=ModelTwo())

        return context


class ObjectsUpdateView(ObjectsAddEditMixin, View):
    def get_context_data(self, **kwargs):
        context = super(ObjectsUpdateView, self).get_context_data(**kwargs)
        context['form_one'] = self.form_class_two(instance=self.objects['form_one'])
        context['form_two'] = self.form_class_one(instance=self.objects['form_two'])

        return context

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2012-04-23
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多