django ModelMultipleChoiceField(默认值)

3 投票
1 回答
5696 浏览
提问于 2025-04-16 06:01

我这几小时一直在搜索和尝试让这个功能正常工作,但一直没成功。

我有一个技能列表,是从数据库里拿来的:

forms.ModelMultipleChoiceField(
                              skills.objects.all(), 
                              required=True, 
                              widget=forms.CheckboxSelectMultiple(),
                              label='Check your skills.',
                              initial=skill_list.objects.filter(user='void'),
                              )

但是这个功能并没有按照我预期的那样工作。我其实是想显示所有的技能,并且把用户勾选的技能也标记为已勾选……唉,我连解释都说不好。

当用户勾选了复选框并在另一个页面点击提交后,我想显示所有技能,并且把用户勾选的技能标记为已勾选。

假设我有 abc,用户勾选了 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 用这些主键来建立合适的关系。

撰写回答