【问题标题】:Prefill MultipleChoiceField django预填充 MultipleChoiceField django
【发布时间】:2016-05-15 09:22:09
【问题描述】:

假设我有以下模型

class Application(models.Model):
    occupation = models.TextField()

和形式

class ApplicationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs)
        super().__init__(*args, **kwargs)
        self.fields['occupation'] = forms.MultipleChoiceField(choices=OCCUPATION_CHOICES, widget=CheckboxSelectMultiple)

    class Meta:
        model = Application

当我将它与实例一起使用时(例如通过管理员),未选择选项。

我做错了什么?

编辑: 澄清:当我选择一些选项时,我点击提交保存数​​据。它们在数据库中看起来像 ['undergraduate', 'postdoc']。但它们不再在表单中检查。

【问题讨论】:

  • 你的super调用有误,应该是super(ApplicationForm, self).__init__(*args, **kwargs)
  • 不,在 python3 中你不必这样写。 docs.python.org/3/library/functions.html#super
  • 您忘记在您的Applicationmodel 中的occupation 字段中添加choices=OCCUPATION_CHOICES
  • 如果我在那里添加它,我会收到以下错误:选择一个有效的选择。 ['postdoc', 'professor'] 不是可用的选择之一。
  • OCCUPATION_CHOICES 包含什么?

标签: django checkbox django-forms


【解决方案1】:

我设法让它像这样工作。

import ast
class ApplicationForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        if kwargs.get('instance'):
            kwargs['initial'] = {
                'occupation': ast.literal_eval(kwargs.get('instance').occupation or '[]'),
            }
        super().__init__(*args, **kwargs)

    class Meta:
        model = Application
        widgets = {
            'occupation': CheckboxSelectMultiple(choices=OCCUPATION_CHOICES),
        }

感谢 RodrigoDela,他让我意识到自己做错了什么,并为我指明了正确的方向。

【讨论】:

    【解决方案2】:

    编辑:TextField不能存储多项选择。看看这个: Django Model MultipleChoice

    您要么使用它,要么覆盖您的表单,以便它们可以将instance.occupation 内容解析到它们的form.occupation 字段中。

    【讨论】:

    • 选择一个有效的选项。 ['postdoc', 'professor'] 不是可用的选择之一。 (再次)
    • 那个错误出现在管理员中?因为代码对我有用。你做了makemigrations 并迁移了?
    • 是的,它在管理员中,我进行了迁移。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2021-10-26
    • 2013-06-06
    相关资源
    最近更新 更多