django ModelMultipleChoiceField(默认值)
我这几小时一直在搜索和尝试让这个功能正常工作,但一直没成功。
我有一个技能列表,是从数据库里拿来的:
forms.ModelMultipleChoiceField(
skills.objects.all(),
required=True,
widget=forms.CheckboxSelectMultiple(),
label='Check your skills.',
initial=skill_list.objects.filter(user='void'),
)
但是这个功能并没有按照我预期的那样工作。我其实是想显示所有的技能,并且把用户勾选的技能也标记为已勾选……唉,我连解释都说不好。
当用户勾选了复选框并在另一个页面点击提交后,我想显示所有技能,并且把用户勾选的技能标记为已勾选。
假设我有 a
、b
和 c
,用户勾选了 b
并提交,那么在任何页面我想显示 a
未勾选、b
已勾选、c
未勾选。
附注:如果我使用 skills.objects.all()
,在HTML中我得到的是 value 1
,我该如何把它变成这样:
skills = (
('a', 'a'),
('b', 'b'),
)
而不是 ('1', 'a'), ('2', 'b')
。
1 个回答
2
你的问题有点不太清楚,但我会尽量帮你解答。
首先,
我想显示所有的技能,以及用户勾选的那个技能...
这个表单无法直接获取用户的信息,所以你需要把用户的信息传递给它。你可以通过重写 __init__
方法来实现,像这样:
def __init__(self, **kwargs):
current_user = kwargs.pop ('user')
super(FormName, self).__init__(attrs)
然后,为了设置最初选择的值,
self.fields['skills'].initial = skill_list.objects.filter(user='void')
记住,你必须在调用基类的构造函数之后再做这个。
最后,
附言:如果我使用 skills.objects.all(),我在 HTML 中得到的是值 1,那我该如何把它变成
skills = ( ('a', 'a'), ('b', 'b'), )
而不是 ('1', 'a'), ('2', 'b')
你为什么想这么做呢?这些数字是你“技能”表中每一行的主键。Django 用这些主键来建立合适的关系。