Django 表单(Formset)无法工作 - id 丢失?

问题描述 投票:0回答:1

我的模板表单不保存对象。 这是我的观点:

class FeatureDeliveryEditView(
    LoginRequiredMixin, PermissionRequiredMixin, SingleObjectMixin, FormView
):
    permission_required = "auth.can_access_supervising_sections"
    model = FeatureFilm
    template_name = "project/project_update/feature/update_featurefilm_delivery.html"

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_form(self, form_class=None):
        return FeatureDeliveryFormSet(**self.get_form_kwargs(), instance=self.object)

    def form_valid(self, form):
        form.save()
        messages.success(self.request, "Delivery erfolgreich gespeichert")
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        messages.error(
            self.request, f"Delivery nicht gespeichert: {form.errors}"
        )
        return super().form_invalid(form)

    def get_success_url(self):
        return (
            reverse("feature-detail-deliveries-half", kwargs={"pk": self.object.pk})
            + "#content-start-under-cards"
        )

    def handle_no_permission(self):
        return redirect("access-denied")

这是我的表单和表单集:

    class FeatureDeliveryForm(ModelForm):
    class Meta:
        model = Delivery
        exclude = (
            "feature_id",
            "tv_movie_id",
            "tv_serie_block_id",
            "restoration_id",
            "source_material",
            "scan_info",
            "usage_version",
            "orderer_id",
            "receiver_1_id",
            "receiver_2_id",
            "receiver_3_id",
        )
        widgets = {
            'trade_mark_brand': forms.Textarea(attrs={'rows': 1}),
            'audio_channel_assignment': forms.Textarea(attrs={'rows': 1}),
            'notes': forms.Textarea(attrs={'rows': 1}),
            # ... Andere Widgets hier
        }


FeatureDeliveryFormSet = inlineformset_factory(
    FeatureFilm,
    Delivery,
    form=FeatureDeliveryForm,
    can_delete=True,
)

如果我使用此模板,表单将被保存并且一切正常:

{% extends "_base.html" %}
{% load crispy_forms_tags %}

{% block content %}

<div class="container">
    <div class="row py-5">
        <h3 class="text-center">{{ object }} - Delivery hinzufügen/editieren</h3>
    </div>
    <div class="row">

          <form method="post" enctype="multipart/form-data">

             {% for hidden_field in form.hidden_fields %}
                {{ hidden_field.errors }}
                {{ hidden_field }}
            {% endfor %}

                {% csrf_token %}

         {{ form.management_form }}
         {{ form.non_form_errors }}

         {% for delivery_form in form.forms %}
            <hr>

                {% if delivery_form.instance.id %}

                    {% if form.forms|length > 1 %}
                        <h5 class="text-warning">Delivery hinzufügen<br><br></h5>
                    {% else %}
                        Delivery hinzufügen<br><br>
                    {% endif %}
                {% endif %}

               <table>

                {{ delivery_form.as_table}}
               </table>



            {% endfor %}
            <hr>
            <p>
                <button type="submit" value="Update Collection" class="btn btn-primary btn-sm">Speichern</button>
                <a href="{% url 'feature-detail-genre-content' pk=object.pk %}#content-start-under-cards" class="btn btn-secondary btn-sm">Zurück</a>
             </p>

         </form>

    </div>
</div>


{% endblock %}

但不幸的是,这个功能模板并没有按照我想象的方式代表形式。每个对象及其字段都显示在另一个之下。但是,我希望并排显示对象的字段,并且每个附加对象接收一个新行。因此,我构建了以下模板。视觉表现与我想象的完全一样,但不幸的是,表单功能,更准确地说,保存功能不再起作用。表单本身为每个对象提供了一个错误,指出缺少“id”。不幸的是,我找不到解决方案。

    {% extends "_base.html" %}
{% load crispy_forms_tags %}

{% block content %}

<div class="container">
    <div class="row py-5">
        <h3 class="text-center">{{ object }} - Delivery hinzufügen/editieren</h3>
    </div>
    <div class="row">


        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
{#            {{ form.management_form }}#}
{#            {{ form.non_form_errors }}#}

        <table class="table table-dark table-bordered">
                    <thead>
                        <tr>
                            <th>Action</th>
                            <th>Del. Nummer</th>
                            <th>Besteller</th>
                            <th>Empfänger 1</th>
                            <th>Content</th>
                            <th>Produkt</th>
                           
                        </tr>
                    </thead>
                    <tbody>

            {% for delivery_form in form.forms %}

                        <tr>
                        <td>
                        {% if delivery_form.instance.id %}
                            {% if form.forms|length > 1 %}
                                <p class="text-warning">ändern</p>
                            {% endif %}
                            {% else %}
                            <p class="text-success">hinzufügen</p>
                        {% endif %}
                        </td>
                            <td>{{ delivery_form.delivery_number }}</td>
                            <td>{{ delivery_form.orderer_id }}</td>
                            <td>{{ delivery_form.receiver_1_id }}</td>
                            <td>{{ delivery_form.content }}</td>
                            <td>{{ delivery_form.product }}</td>
                    
                        </tr>

            {% endfor %}
                 </tbody>
                </table>

            <hr>
            <p>
                <button type="submit" value="Update Collection" class="btn btn-primary btn-sm">Speichern</button>
                <a href="{% url 'feature-detail-genre-content' pk=object.pk %}#content-start-under-cards" class="btn btn-secondary btn-sm">Zurück</a>
            </p>

        </form>


    </div>
</div>


{% endblock %}

卡恩·杰曼德·赫尔芬?

django forms django-templates formset
1个回答
0
投票

“我现在知道缺少了什么,想与您分享。我忘记了对象的 ID 也需要包含在表单中。因此,我在模板中添加了其他目标,现在表单正在保存功能正在运行。”

<form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.management_form }}
        {{ form.non_form_errors }}

    <table class="table table-dark table-bordered">
                <thead>
                    <tr>
                        <th>Action</th>
                        <th>Del. Nummer</th>
                        <th>Besteller</th>
                        <th>Empfänger 1</th>
                        <th>Content</th>
                        <th>Produkt</th>
                        
                        <th>DELETE</th>
                    </tr>
                </thead>
                <tbody>

        {% for delivery_form in form.forms %}

                    <tr>
                    <td>
                    {% if delivery_form.instance.id %}
                        {% if form.forms|length > 1 %}
                            <p class="text-warning">ändern</p>
                        {% endif %}
                        {% else %}
                        <p class="text-success">hinzufügen</p>
                    {% endif %}
                    </td>
                        <td>{{ delivery_form.delivery_number }}</td>
                        <td>{{ delivery_form.orderer_id }}</td>
                        <td>{{ delivery_form.receiver_1_id }}</td>
                        <td>{{ delivery_form.content }}</td>
                        <td>{{ delivery_form.product }}</td>
                  
                         <td>
                            {{ delivery_form.DELETE }}
                            {{ delivery_form.id }}
                            {{ delivery_form.feature_id }}
                        </td>
                        <!-- Füge hier die übrigen Feldwerte hinzu -->
                    </tr>

        {% endfor %}
             </tbody>
            </table>
© www.soinside.com 2019 - 2024. All rights reserved.