使用modelformset_factory将数据添加到Django表单类

时间:2009-07-21 20:37:46

标签: python django django-forms

我有一个问题,我需要为分层数据集显示详细数据的大量表单。我想显示一些关系字段作为表单的标签,我正在努力以更健壮的方式执行此操作。这是代码......

class Category(models.Model):
  name = models.CharField(max_length=160)

class Item(models.Model):
  category = models.ForeignKey('Category')
  name = models.CharField(max_length=160)
  weight = models.IntegerField(default=0)

  class Meta:
    ordering = ('category','weight','name')

class BudgetValue(models.Model):
  value = models.IntegerField()
  plan = models.ForeignKey('Plan')
  item = models.ForeignKey('Item')

我使用modelformset_factory为特定计划创建预算值表单的格式集。我想要的是每个BudgetValue的项目名称和类别名称。当我遍历表单时,每个表单都会被正确标记。

class BudgetValueForm(forms.ModelForm):
item = forms.ModelChoiceField(queryset=Item.objects.all(),widget=forms.HiddenInput())
plan = forms.ModelChoiceField(queryset=Plan.objects.all(),widget=forms.HiddenInput())

category = "" < assign dynamically on form creation >
item = "" < assign dynamically on form creation >
class Meta:
    model = BudgetValue
    fields = ('item','plan','value')

我开始时只是创建budgetvalue.item.category.name,budgetvalue.item.name的字典以及每个预算值的表单。这将传递给模板,我按照我的意图渲染它。我假设formset中的表单和用于生成formset的querset的排序使预算值保持相同的顺序,并且正确创建了字典。这就是budgetvalue.item.name与正确的表单相关联。这让我害怕,我认为必须有更好的方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

好吧,我找到了自己问题的答案。我已经覆盖了表单上的init类,并访问了模型表单的实例。完全按照我的意愿工作,很容易。

class BudgetValueForm(forms.ModelForm):
  item = forms.ModelChoiceField(queryset=Item.objects.all(),widget=forms.HiddenInput())
  plan = forms.ModelChoiceField(queryset=Plan.objects.all(),widget=forms.HiddenInput())

  def __init__(self, *args, **kwargs): 
    super(BudgetValueForm, self).__init__(*args, **kwargs) 
    self.itemname = self.instance.item.name 
    self.categoryname = self.instance.item.category.name 

  class Meta:
    model = BudgetValue
    fields = ('item','plan','value')