与ManagementForm对应的数据不存在或已被修改

时间:2019-05-25 02:36:05

标签: django django-forms formset inline-formset

我目前正在与Django的nestedformset_factory书店合作,因为存在以下情况,我有一个Restaurante模型和TipoCarta模型(这是菜单的可能部分),每个餐馆都添加一个或从菜单TipoCarta可用记录中选择的许多Letters。此外,每个字母可以具有一个到多个产品。 (我附上了上述情况的领域模型)

域模型

我遇到的问题是,我必须向用户显示一个可以在其上注册餐厅的表格,在其中可以添加他们各自的字母和每个字母,可以添加各自的产品及其价格,但是当我必须在数据库中保存注册数据时,Django向我显示以下错误:

错误

但是当我检查页面和POST中发送的数据时,一切似乎都很正常:

开机自检

class RestauranteCreateView(LoginRequiredMixin, CreateView):
    model = Restaurante
    template_name = 'calculadora/restaurante.html'
    form_class = RestauranteForm
    success_url = reverse_lazy('calculadora:restaurantes')

    def get(self, request, *args, **kwargs):
        super(RestauranteCreateView, self).get(self, request, *args, **kwargs)
        context = self.get_context_data(**kwargs)
        context['carta_formset'] = nestedformset_factory(
            Restaurante,
            Carta,
            form=CartaForm,
            min_num=1,
            max_num=5,
            extra=0,
            can_delete=False,
            nested_formset=inlineformset_factory(
                parent_model=Carta,
                model=Producto,
                form=ProductoForm,
                min_num=1,
                max_num=20,
                extra=1,
                can_delete=False
            )
        )
        return self.render_to_response(context)
def post(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    restaurante_form = self.get_form(form_class)
    carta_formset = CartaFormSet(request.POST, prefix='carta')
    producto_formset = ProductoFormSet(request.POST, prefix='producto')
    if restaurante_form.is_valid() and carta_formset.is_valid() and producto_formset.is_valid():
        restaurante = Restaurante.objects.update_or_create(
            nombre=restaurante_form['nombre'].value(),
            direccion=restaurante_form['direccion'].value(),
            telefono=restaurante_form['telefono'].value(),
            mapa=restaurante_form['mapa'].value(),
            administrador=request.user,
            barrio=restaurante_form['localidad'].value()
        )
        for carta_form in carta_formset:
            carta = Carta.objects.update_or_create(
                tipo=carta_form['tipo'],
                restaurante=int(restaurante)
            )
            carta.save()
            for producto_form in producto_formset:
                producto = Producto.objects.update_or_create(
                    carta=carta,
                    nombre=producto_form['nombre'],
                    precio_fijo=producto_form['precio_fijo']
                )
                producto.save()
        context = {
            'messages': ['El restaurante ha sido registrado exitosamente.']
        }
        return HttpResponseRedirect(self.success_url, context=context)

表格

restaurante_carta_add.html

<div class="row" id="carta-management-form">
    {{ carta_formset.management_form }}
</div>
{% load bootstrap %}
{% for carta_form in carta_formset %}
    <div id="{{ carta_form.prefix }}-row" class="row {{ carta_formset.prefix }}">
        <div class="col-lg-12">
            <fieldset>
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">
                            <i class="fa fa-puzzle-piece fw"></i>
                            Sección
                            <a class="pull-right" role="button" data-toggle="collapse" href="#{{ carta_form.prefix }}" aria-expanded="false" aria-controls="{{ carta_form.prefix }}" title="Añade productos a esta sección">
                                Productos <i class="fa fa-plus fw"></i>
                            </a>
                            {% if forloop.last %}
                                <!--
                                    <span id="add-{{ carta_form.prefix }}-btn" type="button"  class="pull-right" onclick="cloneMore('{{ carta_form.prefix }}', '{{ carta_formset.prefix }}', false)">
                                        <i class="fa fa-plus fw"></i>
                                    </span>
                                -->
                            {% else %}
                                <!--
                                    <span id="remove-{{ carta_form.prefix }}-btn" type="button"  class="pull-right" onclick="deleteForm('{{ carta_form.prefix }}', '{{ carta_formset.prefix }}')">
                                        <i class="fa fa-trash-alt fw"></i>
                                    </span>
                                -->
                            {% endif %}
                        </h3>
                </div>
                <div class="panel-body">
                    <div class="row">
                        <div class="col-lg-12">
                            {{ carta_form|bootstrap_horizontal }}
                        </div>
                    </div>
                    <div id="{{ carta_form.prefix }}" class="row collapse">
                        <div class="col-lg-12">
                            <legend>
                                Productos de la sección
                            </legend>
                            {% include 'calculadora/restaurante_producto_add.html' %}                                            
                        </div>
                    </div>
                </div>
            </fieldset>
        </div>
    </div>
{% endfor %}

restaurante_producto_add.html

<div>
    <div class="row" id="producto-management-form">
        {{ carta_form.nested.management_form }}
    </div>
    <div  class="row">
        {% load bootstrap %}
        {% for producto_form in carta_form.nested %}
            <div id="{{ producto_form.prefix }}-row" class="row {{ carta_form.nested.prefix }}">
                <div class="col-lg-12">
                    <div class="form-group">
                        <label class="control-label col-sm-2 col-lg-2 ">Producto</label>
                        <div class="col-sm-10 col-lg-10">
                            <div class="input-group mb-3">
                                <div>
                                    {{ producto_form.nombre }}
                                </div>
                                <div class="input-group-addon">
                                    /
                                </div>
                                <div>
                                    {{ producto_form.precio_fijo }}
                                </div>
                                {% if forloop.last %}
                                    <div class="input-group-addon">
                                        <span id="add-{{ producto_form.prefix }}-btn" type="button" onclick="cloneMore('{{ producto_form.prefix }}', '{{ carta_form.nested.prefix }}')">
                                            <i class="fa fa-plus fw"></i>
                                        </span>
                                    </div>
                                {% else %}
                                    <div class="input-group-addon">
                                        <span id="remove-{{ producto_form.prefix }}-btn" type="button" onclick="deleteForm('{{ producto_form.prefix }}', '{{ carta_form.nested.prefix }}')">
                                            <i class="fa fa-trash-alt fw"></i>
                                        </span>
                                    </div>
                                {% endif %}
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        {% endfor %}
    </div>
</div>

我希望有人可以帮助我,因为我已经解决这个问题好几天了,但是我一直无法解决,所以我用西班牙语问了Stackoverflow,但是没人帮我,所以我去了这里,我尝试使用Jquery动态FormSet库,但是如果只发送一个表单集,则此表单将很有用,但是在我的情况下,我将发送2个表单集和一个表单,其中,第一个表单集取决于表单以及每个表单集,另一个表单集要看。我坚持要告诉他们我已经尝试了在Stackoverflow中找到的所有内容,但对我没有任何帮助,我什至为每个表单集都添加了前缀,并不断抛出该错误。事先非常感谢。

0 个答案:

没有答案