django - 如何使用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 中添加并显示。我怎样才能做正确的事情来正确显示它?
解决方案
推荐阅读
- php - 根据条件从数组中删除值
- android - 我们可以使用 Twilio 发送 SMS 数据吗?
- php - echo 打印的表单不提交
- asp.net-mvc - Fullcalendar 不会重新加载,即使使用 refetchEvents 和 rerenderEvents
- javascript - 用javascript输入文本
- java - Thymeleaf 不解释 sec 标签
- ruby-on-rails - 嵌套 activeadmin 形式的 Rails Froala 编辑器
- android - 我制作了一个 android 相机应用程序,但我想将它向左旋转 90 度和向右旋转 90 度,我该怎么做?
- ios - 从 AppDelegate 在 Swift 上调用异步函数
- python - Tkinter - 切换到不同页面时如何重置网格行配置