В настоящее время я работаю с книжным магазином nestedformset_factory для Django, потому что у меня есть следующая ситуация, у меня есть модель Restaurante и модель TipoCarta (которая будет, как возможные разделы меню), каждый ресторан добавляет один или Много букв в его меню, которое выбирает из записей, доступных в таблице ТипоКарта. Кроме того, каждая буква может иметь от одного до нескольких продуктов. (Прилагаю модель домена указанной ситуации)
Доменная модель
Проблема, с которой я столкнулся, заключается в том, что я должен показать пользователю форму, в которой я могу зарегистрировать ресторан, и в нем я могу добавить их соответствующие буквы и каждую букву, я могу добавить их соответствующие продукты, с их ценами, но когда мне нужно сохранить в моей базе данных зарегистрированные данные, Django показывает мне следующую ошибку:
Error
Но когда я проверяю страницу и данные, отправленные в POST, все кажется нормальным:
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 на испанском языке, и никто не помог мне, поэтому я пошел сюда, я пытался использовать динамическая библиотека FormSet Jquery, но эта была бы полезна, если бы только она отправляла набор форм, но в моем случае я отправляю 2 набора форм и форму, в которой первый набор форм зависит от формы и каждого набора форм, другой набор форм зависит. Я настаиваю, когда говорю им, что перепробовал все, что нашел в Stackoverflow, и у меня ничего не работает, я даже ставлю префикс для каждого набора форм и продолжаю выдавать эту ошибку. Заранее большое спасибо.