【问题标题】:Django: creating dynamic formsDjango:创建动态表单
【发布时间】:2012-05-21 13:24:04
【问题描述】:

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

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)

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

  1. 我的模型设计是否适合这个问题?
  2. 如何根据饮料的数量制作表单?

【问题讨论】:

标签: python django forms models


【解决方案1】:

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

问题 2:表单集...

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

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

【讨论】:

  • 太棒了。希望我能在睡觉前看到这个,这样我就可以睡得更好了 :) 最后一件奇怪的事情,当我写:首先获取位置它的工作原理: location = Location.objects.get(location_id=location_id) qs=Beverage.objects.filter(location=location) 为什么会这样??
  • 很高兴为您提供帮助。我非常怀疑您的查询集问题。在 update_inventory(request, location_id) 中,location_id 是用于传递模型实例的 pk 的常用约定(也等于 location.id)。由于您在 Location 模型中命名了一个名为 location_id 的字段,因此您需要格外小心在任何给定时刻使用其中的哪一个,或者更好的解决方案是重命名参数或字段名称。由于上述约定,我建议更改字段名称。
  • ends up "location_id" 与它无关,这里有很多东西,但它们与原始帖子无关
猜你喜欢
  • 2016-11-11
  • 2021-06-03
  • 2019-05-05
  • 2018-11-17
  • 2021-03-10
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多