简体   繁体   English

Django:创建动态表单

[英]Django: creating dynamic forms

I have these models and I want to build forms based on the data: 我有这些模型,我想基于数据构建表单:

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)

Here is what I want to happen, when a user goes to update inventory for a particular location, I want them to get a form that lists out all the possible beverages for that location (the beverages differ per location) and then create an Inventory form for it that will create a new line in the Inventory table for each Beverage for that Location . 这就是我想要发生的事情,当用户去更新特定地点的库存时,我希望他们获得一个表格,列出该地点的所有可能饮料(饮料因地点而异),然后创建Inventory表格对于它,它将在Inventory表中为该Location每个Beverage创建一个新行。 Each one needs a timestamp so we can have a history. 每个人都需要一个时间戳,所以我们可以有一个历史。 I think I get that I need formsets, but I have not had any success figuring out how to implement them for this. 我想我得到了我需要的表格集,但我没有成功找出如何为此实现它们。 So, this is kind of a two-parter: 所以,这是一个两个部分:

  1. Is my model design right for this problem? 我的模型设计适合这个问题吗?
  2. How can I make forms that depend on the number of beverages to build themselves? 我如何制作依赖于自己制作饮料数量的表格?

Question 1: model design - I would drop the location field from the Inventory model, since it is already in the Beverage model, and is redundant. 问题1:模型设计 - 我会从库存模型中删除位置字段,因为它已经在Beverage模型中,并且是多余的。 Otherwise, they look good to me. 否则,它们对我来说很好看。

Question 2: formsets... 问题2:formsets ...

forms.py forms.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')

views.py views.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()
    ...

modelformset_factory will create a form for every object (Beverage) in the queryset which is filtered by the desired location, and has an extra field in the customized ModelForm to report units. modelformset_factory将为查询集中的每个对象(Beverage)创建一个表单,该表单由所需位置过滤,并在自定义ModelForm中有一个额外字段来报告单位。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM