在django中自动生成表单的表单域 [英] Auto-generate form fields for a Form in django

查看:65
本文介绍了在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)
/ pre>

有没有办法自动生成表单域?
我知道我可以在每个SkillCategory的表单中手动添加一个SkillCategory条目,但是将其作为模型的原因是,可以自由编辑技能和技能类别。



我想做这样的事情:
(我试过这个,但没有得到它的工作,不记得确切的错误...)



forms.py

 类SkillSelectionForm(forms.Form) 
def __init __(* args,** kwargs):
super(SkillSelectionForm,self).__ init __(* args,** kwargs)
for SkillCategory.objects.all()
category_skills = [(pk,s.name)for c in c.skill_set.all()]
setattr(self,c.name,forms.MultipleChoiceField(choices = category_skills,widget = forms.CheckboxSelectMultiple )






解决方案



这将使用SkillCategory.name创建一个表单域条目,并将其分配给技能中的选项。 field_name / display_name用于避免非ascii 类别名称的问题。



forms.py

  def get_categorized_skills():
skills = {}
for Skill.objects.values('pk' ,'name','category__name')。order_by('category__name'):
如果s ['category__name']不在skill.keys()中:
技能[s ['category__name']] = []
技能[s ['category__name']]。append((s ['pk'],s ['name']))
返回技能

class SkillSelectionForm (form.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 [ca t],widget = forms.CheckboxSelectMultiple,label = display_name)


解决方案

p>看看在Django创建动态表单,从 b-list.org uswaretech.com 。我已经成功地使用这些示例从模型中动态创建表单内容。


I have some models and I want to generate a multi-selection form from this data. So the form would contain an entry for each category and the choices would be the skills in that category.

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)

Is there a way to auto-generate the form fields? I know I can manually add a 'SkillCategory' entry in the form for each SkillCategory, but the reason to have it as a model is so skills and skillcategories can be edited freely.

I want to do something like this: (I tried this, but didn't get it to work, don't remember the exact error...)

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

This creates a form field entry using the SkillCategory.name and assigns choices as those in Skill. field_name/display_name are used to avoid issues with non-ascii category names.

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)

解决方案

Take a look at creating dynamic forms in Django, from b-list.org and uswaretech.com. I've had success using these examples to dynamically create form content from models.

这篇关于在django中自动生成表单的表单域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆