相关疑难解决方法(0)

为什么Django中的只读表单字段是个坏主意?

我一直在寻找一种创建只读表单字段的方法,我在这个主题上发现的每篇文章都附带一个声明"这是一个坏主意".现在对于单个表单,我可以理解还有其他方法可以解决问题,但在modelformset中使用只读表单字段似乎是一个完全自然的想法.

考虑一个教师成绩簿应用程序,老师希望能够通过一个SUBMIT输入所有学生(注意复数学生)成绩.modelformset可以迭代所有学生成绩,学生姓名是只读的,成绩是可编辑的字段.我喜欢使用modelformset获得的错误检查和错误报告的强大功能和便利性,但是让学生名称在这样的表单中可编辑是疯狂的.

由于专家django的共识是只读表单字段是一个坏主意,我想知道上面的示例学生级示例的标准django最佳实践是什么?

django django-models django-forms

27
推荐指数
2
解决办法
2万
查看次数

在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)
Run Code Online (Sandbox Code Playgroud)

有没有办法自动生成表单字段?我知道我可以在每个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))
Run Code Online (Sandbox Code Playgroud)

这将使用SkillCategory.name创建表单字段条目,并将选项分配为Skill中的选项.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 …
Run Code Online (Sandbox Code Playgroud)

python django django-forms

9
推荐指数
1
解决办法
4794
查看次数

标签 统计

django ×2

django-forms ×2

django-models ×1

python ×1