首页 > 解决方案 > 如何使用formset在页面上显示多个表单

问题描述

我正在制作表格以添加组织记录

models.py:
class Entity(BaseModel):
    title = models.CharField(_('Заголовок'), max_length=255, db_index=True)
    short_description = models.CharField(_('Короткое описание'), max_length=255, blank=True, null=True)
    body = models.TextField(verbose_name=_('Описание'), max_length=4096)
    ordering = models.IntegerField(_('Порядок'), default=0, db_index=True)
    test_field = models.TextField(verbose_name=_('Тестовое поле'), max_length=4096)
    test_field2 = models.CharField(max_length=255, blank=True,null=True, verbose_name=_('Тестовое поле 2'))

    class Meta:
        ordering = ('ordering',)
        verbose_name = _('Форма')
        verbose_name_plural = _('Формы')


class Industry(BaseModel):
    name = models.CharField(_('Название'),max_length=255, blank=True, null=True)
    entity = models.ForeignKey(
        Entity, verbose_name=_('Организация'), related_name='industries', on_delete=models.CASCADE
    )

    class Meta:
        ordering = ('ordering',)
        verbose_name = _('Отрасль')
        verbose_name_plural = _('Отрасли')

    def __str__(self):
        return self.name


class BaseAddressClass(BaseModel):
    address = models.TextField(verbose_name=_('Адрес'), blank=True, null=True)
    oktmo = models.CharField(verbose_name=_('ОКТМО'),max_length=255, blank=True, null=True)
    postal_code = models.CharField(verbose_name=_('Почтовый индекс'), max_length=20, blank=True, null=True)
    entity = models.ForeignKey(
        Entity, verbose_name=_('Организация'), related_name='addresses', on_delete=models.CASCADE, blank=True, null=True
    )

    class Meta:
        ordering = ('ordering',)


class PhysicalAddress(BaseAddressClass):
    class Meta:
        verbose_name = _('Физический адрес')
        verbose_name_plural = _('Физические адреса')


class LegalAddress(BaseAddressClass):
    class Meta:
        verbose_name = _('Юридический адрес')
        verbose_name_plural = _('Юридические адреса')

我希望页面在列表中显示分支,并且还能够添加地址。为此,我在 EntityForm 中添加了行业。添加地址的表单 inlineformset_factory.for 呈现我正在使用 django-formset.js 的表单集。

forms.py:
class EntityForm(forms.ModelForm):
    industry = forms.ModelChoiceField(queryset=models.Industry.objects.all())

    class Meta:
        fields = '__all__'
        exclude = ('ordering', 'status')
        model = models.Entity


PhysicalAddressFormSet = inlineformset_factory(
    models.Entity, models.PhysicalAddress, form=EntityForm,
    fields=('address', 'oktmo', 'postal_code'), extra=1, max_num=1, validate_max=1, can_delete=False
)


views.py:
class EntityView(BaseTemplateView, CreateView):
    template_name = 'accounts/articles_list.html'
    model = accounts_models.Entity
    form_class = forms.EntityForm
    success_url = 'success/'

    def get(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        phys_form = forms.PhysicalAddressFormSet()
        return self.render_to_response(
            self.get_context_data(form=form, phys_form=phys_form))
template:
 <div class="container py-5">
        <form action="." method="post">
            {{- csrf_input -}}
            <div>
                {{ form.title.errors }}
                {{ form.title }}
                {{ form.body.errors }}
                {{ form.slug }}
                {{ form.slug.errors }}
                {{ form.body }}
                {{ form.test_field.errors }}
                {{ form.test_field }}
                {{ form.test_field2.errors }}
                {{ form.test_field2 }}
                {{ form.industry }}
            </div>
            <fieldset>
                <legend>Волженная форма</legend>

                {{ phys_form.management_form }}
                {{ phys_form.non_form_errors }}


                <table class="table table-hover">
                    {% for form in phys_form %}
                        <tr class="inline {{ phys_form.prefix }}">
                            {{ form }}
                        </tr>
                    {% endfor %}
                </table>
            </fieldset>

            <input type="submit" value="Save" class="submit"/>
        </form>

 <script type="text/javascript">
        $(document).ready(function () {
            $(function () {
                $(".inline.{{ phys_form.prefix }}").formset({
                    prefix: "{{ phys_form.prefix }}",
                })
            })
        })
    </script>

在这种情况下,事实证明字段行业显示在列表中,但它也在 PhysicalAddressFormSet 中添加并显示。我怎样才能做正确的事情来正确显示它?

标签: djangodjango-formsdjango-views

解决方案


推荐阅读