Данные, соответствующие ManagementForm, не существуют или были изменены - PullRequest
0 голосов
/ 25 мая 2019

В настоящее время я работаю с книжным магазином 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, и у меня ничего не работает, я даже ставлю префикс для каждого набора форм и продолжаю выдавать эту ошибку. Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...