Django:创建动态表单

jas*_*les 5 python forms django models

我有这些模型,我想根据数据构建表单:

class Location(models.Model):
    name=models.CharField(max_length=255)
    location_id=models.CharField(max_length=255)
    organization=models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Beverage(models.Model):
    name=models.CharField(max_length=255)
    location=models.ForeignKey(Location)
    fill_to_standard=models.IntegerField(max_length=10)
    order_when_below=models.IntegerField(max_length=10)

    def __unicode__(self):
        return self.name

class Inventory(models.Model):
    location=models.ForeignKey(Location)
    beverage=models.ForeignKey(Beverage)
    units_reported=models.IntegerField(max_length=10)
    timestamp=models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

这是我想要发生的事情,当用户去更新特定位置的库存时,我希望他们得到一个表格,列出该位置的所有可能的饮料(饮料因位置而异),然后创建一个Inventory表格这将创建在一个新行Inventory表中的每个BeverageLocation。每个人都需要一个时间戳,以便我们可以拥有历史。我想我知道我需要表单集,但是我没有成功弄清楚如何为此实现它们。所以,这有点像两部分:

  1. 我的模型设计是否适合这个问题?
  2. 我如何制作依赖于饮料数量的表格来构建自己?

Ben*_*ick 3

问题 1:模型设计 - 我会从库存模型中删除位置字段,因为它已经在饮料模型中,并且是多余的。否则,他们对我来说看起来不错。

问题2:表格...

表格.py

from django import forms
from my_project.my_app.models import Beverage

class InventoryForm(forms.ModelForm):
    units_reported = forms.IntegerField()
    class Meta:
        model = Beverage
        fields = ('name', 'id')
Run Code Online (Sandbox Code Playgroud)

视图.py

from django.forms.models import modelformset_factory
from my_project.my_app.models import Beverage, Inventory

def update_inventory(request, location_id):

    InventoryFormSet = modelformset_factory(Beverage, form=InventoryForm)
    qs = Beverage.objects.filter(location=location_id)
    formset = InventoryFormSet(queryset=qs)
    if request.method == 'POST':
        formset = InventoryFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                beverage = form.save(commit=False)
                units_reported = form.cleaned_data['units_reported']
                Inventory(beverage=beverage, units_reported=units_reported).save()
    ...
Run Code Online (Sandbox Code Playgroud)

modelformset_factory 将为查询集中的每个对象(饮料)创建一个表单,该表单按所需位置进行过滤,并在自定义 ModelForm 中具有一个额外字段来报告单位。