我是Django的新手,我目前正在尝试创建一个表单,它应该包含另一个模型的所有现有对象的输入字段。假设我想在家里管理我的物资,并确保我有足够的各种产品在不同的存储位置。
例如,我想确保存储位置bathroom
和basement
应该始终有充足的供应toilet paper
。我不需要toilet paper
在位置kitchen
。存储位置是预先定义的,可以通过模型获得。我找不到任何方法为Supply
创建一个表单,它基于所有可用的StorageLocation
对象动态生成MinimumQuantity
对象的表单字段。
我的表单应该是这样的,当创建供应"卫生纸":
supply name: <input example: "toilet paper">
minimum supply quantities
bathroom - amount: <input example: 6>
kitchen - amount: <input example: 0>
basement - amount: <input example: 3>
我有点糊涂了,如果能给点提示,我将不胜感激。
这是我当前的代码(缩短):
models.py:
class Supply(models.Model):
name = models.CharField(max_length=50)
class StorageLocation(models.Model):
name = models.CharField(max_length=50)
class MinimumQuantity(MinimumQuantity):
storage_location = models.ForeignKey(StorageLocation, on_delete=models.PROTECT)
supply = models.ForeignKey(Supply, on_delete=models.PROTECT)
amount = models.IntegerField()
views.py:
class SupplyCreateView(CreateView):
model = Supply
template_name = "supplies_form.html"
fields = [ 'name', ]
supplies_form.html:
<div class="card-body">
{% csrf_token %}
{{ form|crispy }}
</div>
我在stackoverflow和其他网站上偶然发现了各种相关的问题,并摆弄着格式集,但我的问题似乎是:
- 我有一个一对多从供应到MinimumQuantity,不能想到任何方式告诉供应,和 虽然所有的StorageLocation对象已经存在,但MinimumQuantity对象不存在。
我是否甚至把这个结构弄得太复杂了,有没有办法在没有MinimumQuantity模型的情况下解决整个问题?谢谢!
在这里,我们必须使用ModelForm并设置fields属性以包含您想要包含在表单中的MinimumQuantity模型的字段。在您的示例中,这将是storage_location字段和amount字段。
现在,首先将此添加到代码中,并对SupplyCreateView进行更改:
from django.forms import ModelForm
class MinimumQuantityForm(ModelForm):
class Meta:
model = MinimumQuantity
fields = ['storage_location', 'amount']
class SupplyCreateView(CreateView):
model = Supply
template_name = "supplies_form.html"
form_class = MinimumQuantityForm
fields = ['name']
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['minimum_quantities'] = MinimumQuantity.objects.all()
return context
,然后在supplies_form.html中这样做:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<div class="card-body">
<h4>Minimum supply quantities</h4>
{% for minimum_quantity in minimum_quantities %}
<div class="form-group">
<label for="id_{{ minimum_quantity.storage_location.name }}">{{ minimum_quantity.storage_location.name }}</label>
<input type="number" name="{{ minimum_quantity.storage_location.name }}" id="id_{{ minimum_quantity.storage_location.name }}" required>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">Save</button>
</div>