【问题标题】:Showing "Please choose:" in a Django's `Select` widget在 Django 的“选择”小部件中显示“请选择:”
【发布时间】:2011-07-28 04:45:37
【问题描述】:

我正在制作一个 Django 表单并使用 ChoiceField 生成一个带有不同选项的 <select> 框。我希望<select> 框的第一个选项是“请选择:”,如果用户在没有选择的情况下提交表单,他会收到错误。

什么是这样做的好方法?

【问题讨论】:

    标签: python django validation forms


    【解决方案1】:

    似乎 Django 没有对此类请求的内置支持。您可以通过继承ChoiceField 并使其接受blank_choice 参数来实现它。例如

    from django import forms
    
    
    class ChoiceField(forms.ChoiceField):
        def __init__(self, *args, **kwargs):
            self.blank_choice = kwargs.pop('blank_choice', None)
            super(ChoiceField, self).__init__(*args, **kwargs)
    
        def _get_choices(self):
            return self._choices
    
        def _set_choices(self, value):
            choices = list(value)
            if self.blank_choice:
                choices = [('', self.blank_choice)] + choices
            self._choices = self.widget.choices = choices
    
        choices = property(_get_choices, _set_choices)
    

    这个空白选项被添加到正常的选项集之前,并被视为一个空值。 (这就是我使用None 作为与self.blank_choice 选项关联的值的原因,因为它在django.core.validators.EMPTY_VALUES 元组中)。

    要使用它,请使用 ChoiceField 而不是 Django 提供的那个,并传入 blank_choice 的值,例如

    from django import forms
    from myproject.formfields import ChoiceField
    
    NAMES = (
        ('brad', 'Brad'),
        ('sam', 'Sam'),
    )
    
    class MyForm(forms.Form):
        names = ChoiceField(choices=NAMES, blank_choice='Please choose:')
    

    【讨论】:

    • 由于某种原因它不起作用(Django 不调用_set_choices 方法)。为什么?
    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 2020-09-24
    • 2012-06-10
    • 2022-01-26
    • 2021-11-20
    • 1970-01-01
    • 2023-03-17
    • 2021-04-07
    相关资源
    最近更新 更多