如何在Django中创建一个包含其他模型所有示例字段的表单?

8dtrkrch  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(180)

我是Django的新手,目前我正在尝试创建一个表单,其中应该包含另一个模型的所有现有对象的输入字段。假设我想在家里管理我的用品,并确保我有足够的各种产品在不同的存储位置。
例如,我希望确保存储位置bathroombasement始终具有充足的toilet paper供应。我不需要在位置kitchen中使用toilet paper。存储位置是预定义的,可通过模型使用。我无法' I don "我找不到任何方法来创建Supply表单,该表单基于所有可用的StorageLocation对象动态生成MinimumQuantity对象的表单域。
创建供应"tailet paper"时,我的表单应如下所示:

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', ]

供应品_表单. html:

<div class="card-body">
    {% csrf_token %}
    {{ form|crispy }}
</div>

我在stackoverflow和其他网站上偶然发现了各种相关的问题,并摆弄了一下表单集,但我的问题似乎是:
1.我有一个从供应到最小数量的一对多关系,想不出任何方法来告诉供应,并且
1.虽然所有StorageLocation对象都已存在,但MinimumQuantity对象不存在。
我是不是把这个构造弄得太复杂了,有没有一种方法可以完全不用MinimumQuantity模型来解决整个问题?谢谢!

n9vozmp4

n9vozmp41#

在这里,我们必须使用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>

相关问题