我有一些模型,我想從這些數據生成一個多選表單。 因此,表單將包含每個類別的條目,並且選擇將是該類別中的技能。自動生成表單域在Django
models.py
class SkillCategory(models.Model):
name = models.CharField(max_length=50)
class Skill(models.Model):
name = models.CharField(max_length=50)
category = models.ForeignKey(SkillCategory)
是否有辦法來自動生成表單字段? 我知道我可以在表格中爲每個SkillCategory手動添加一個'SkillCategory'條目,但將其作爲模型的原因是技能和技能類別可以自由編輯。
我想要做這樣的事情: (這個我試過,但沒有得到它的工作,不記得確切的錯誤...)
forms.py
class SkillSelectionForm(forms.Form):
def __init__(*args, **kwargs):
super(SkillSelectionForm, self).__init__(*args, **kwargs)
for c in SkillCategory.objects.all():
category_skills = [(pk, s.name) for s in c.skill_set.all()]
setattr(self, c.name, forms.MultipleChoiceField(choices=category_skills, widget=forms.CheckboxSelectMultiple))
SOLUTION
這產生使用Sk的一個形式字段條目illCategory.name並將選項分配爲技能中的選項。 field_name/display_name用於避免與非ascii 類別名稱有關的問題。
forms.py
def get_categorized_skills():
skills = {}
for s in Skill.objects.values('pk', 'name', 'category__name').order_by('category__name'):
if s['category__name'] not in skills.keys():
skills[s['category__name']] = []
skills[s['category__name']].append((s['pk'], s['name']))
return skills
class SkillSelectionForm(forms.Form):
def __init__(self, *args, **kwargs):
super(SkillSelectionForm, self).__init__(*args, **kwargs)
skills = get_categorized_skills()
for idx, cat in enumerate(skills.keys()):
field_name = u'category-{0}'.format(idx)
display_name = cat
self.fields[field_name] = forms.MultipleChoiceField(choices=skills[cat], widget=forms.CheckboxSelectMultiple, label=display_name)
謝謝,這指出我在正確的方向,請參閱上面的編輯我的最終解決方案。 – monkut 2009-09-11 15:00:44