django - Django表单如何在内部表单中显示相关数据
问题描述
我正在为 Django 表单而苦苦挣扎。我有以下model.py:
class Property(models.Model):
portfolio = models.ForeignKey("portfolios.Portfolio", on_delete=models.CASCADE)
class PropertyImage(models.Model):
property = models.ForeignKey("Property", on_delete=models.CASCADE)
image = models.ImageField(upload_to = property_image_upload_to)
def __str__(self):
return self.image.url
class PropertyDocument(models.Model):
property = models.ForeignKey("Property", on_delete=models.CASCADE)
document = models.FileField()
class Address(models.Model):
property = models.OneToOneField("Property", on_delete=models.CASCADE)
line1 = models.CharField(max_length=100)
line2 = models.CharField(max_length=100, null=True, blank=True)
line3 = models.CharField(max_length=100, null=True, blank=True)
post_code = models.CharField(max_length=7)
town = models.CharField(max_length=100, null=True, blank=True)
city = models.CharField(max_length=100)
添加/更新属性时,我希望表单显示地址、文档/图像等相关对象的表单,而不是表单中出现的选择列表 - 我希望能够添加/编辑相关数据。
我的 view.py 文件
class PropertyCreate(CreateView):
model = Property
form_class=PropertyAddressFormSet
success_url = reverse_lazy('Property_list')
def get_context_data(self, **kwargs):
data = super(PropertyCreate, self).get_context_data(**kwargs)
return data
Property_form.html
{% extends 'base/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" class="btn btn-primary" />
<button class="btn btn-link" onclick="javascript:history.back();">Cancel</button>
</form>
{% endblock %}
网址.py
from . import views
app_name = 'properties'
urlpatterns = [
path('<int:portfolio_id>/<int:pk>/edit', views.PropertyUpdate.as_view(), name='property_edit'),
path('<int:portfolio_id>/create', views.PropertyCreate.as_view(), name='property_new'),
]
我已经阅读了有关 inlineformset_factories 和 inlineformset 等的信息,但这是我的方案的最佳选择吗?如果是这样,我不知道如何显示投资组合,地址表格
我目前正在使用这样的内联表单集,它在 PropertyCreate 视图上创建地址表单,但我还想将 PropertyImages 和 PropertyDocs 添加到 ProertyCreate 视图中:
PropertyAddressFormSet = inlineformset_factory(
parent_model=Property,
model=Address,
form=AddressForm,
extra=0,
min_num=1
)
解决方案
对于与我在同一条船上的任何人,我设法使用以下代码使其工作:
表格.py:
class PropertyForm(ModelForm):
""" Edit a property """
class Meta:
model = Property
exclude = ()
PropertyAddressFormSet = inlineformset_factory(
parent_model=Property,
model=Address,
form=AddressForm,
extra=0,
min_num=1
)
视图.py
class PropertyCreate(CreateView):
model = Property
form_class=PropertyForm
success_url = reverse_lazy('Property_list')
def get_context_data(self, **kwargs):
data = super(PropertyCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['address'] = PropertyAddressFormSet (self.request.POST, instance=self.object)
else:
data['address'] = PropertyAddressFormSet ()
return data
模板:
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form |crispy }}
<fieldset class="border p-2">
<legend class="w-auto">Address</legend>
{{ address.management_form }}
{% for form in address.forms %}
<div >
{{ form.as_p }}
</div>
{% endfor %}
</fieldset>
</form>
希望这可以帮助某人。
推荐阅读
- python - input a number in a while loop for a python bowling program
- python-3.x - 使用 self 参数在循环中创建和调用自定义函数名称
- laravel - 如何重置 Xampp 的默认页面?
- postgresql - 针对多个值查询 Postgres 中的 jsonb 列
- swagger - 用于 Spring Data Rest 的 Swagger 2 或 3
- javascript - 我该如何解决 [Vue 警告]:数据()中的错误:Laravel Vue 中的“ReferenceError:total is not defined”
- linux - NixOps:如何部署到现有的 NixOS VM?
- python - Python合并不相等的数据框
- python - 使用 /insights edge 的 Instagram Graph API 问题
- spring - 具有由多个线程调用的方法的 Spring 组件