我目前正在与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中找到的所有内容,但对我没有任何帮助,我什至为每个表单集都添加了前缀,并不断抛出该错误。事先非常感谢。