我有一个问题,我需要为分层数据集显示详细数据的大量表单。我想显示一些关系字段作为表单的标签,我正在努力以更健壮的方式执行此操作。这是代码......
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与正确的表单相关联。这让我害怕,我认为必须有更好的方法。任何帮助将不胜感激。
答案 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')