使用modelformset_factory向Django表单类添加数据

0 投票
1 回答
2422 浏览
提问于 2025-04-15 13:03

我遇到一个问题,需要为一个层级数据集显示很多表单,主要是一些详细数据。我想把一些相关字段作为表单的标签,但我在找更稳妥的方法来实现这一点,感觉有点困难。下面是我的代码……

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来为特定计划创建一个预算值表单的集合。我希望每个预算值都有对应的项目名称和类别名称。当我遍历这些表单时,每个表单都能正确标记。

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和每个预算值的表单。然后把这个字典传递给模板,按我想要的方式渲染出来。我假设表单集合中的表单顺序和生成表单集合时使用的查询集保持一致,这样字典就能正确创建。也就是说,budgetvalue.item.name能和正确的表单关联起来。但这让我有点担心,我觉得应该有更好的方法。任何帮助都非常感谢。

1 个回答

3

好吧,我自己找到了问题的答案。我在表单上重写了初始化类,并访问了模型表单的实例。这样做正好符合我的需求,而且非常简单。

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')

撰写回答