如何在Django中为另一个模型的所有实例创建一个字段的表单?



我是Django的新手,我目前正在尝试创建一个表单,它应该包含另一个模型的所有现有对象的输入字段。假设我想在家里管理我的物资,并确保我有足够的各种产品在不同的存储位置。

例如,我想确保存储位置bathroombasement应该始终有充足的供应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和其他网站上偶然发现了各种相关的问题,并摆弄着格式集,但我的问题似乎是:

  1. 我有一个一对多从供应到MinimumQuantity,不能想到任何方式告诉供应,和
  2. 虽然所有的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>

相关内容

  • 没有找到相关文章

最新更新