Django自定义字段或小部件?

时间:2011-02-16 09:31:05

标签: django django-forms

我有一个整数字段,但它们的默认小部件是TextInput。我想使用Select小部件,但我必须明确提供可能的值。

是否可以从'initial', 'min_value' and 'max_value'字段的integer!验证规则自动生成它们?

我是否必须制作自己的字段,小部件或两者?怎么样?

3 个答案:

答案 0 :(得分:2)

您可以使用__init__方法形式执行此操作。

def MyForm(forms.Form):
   my_integer = forms.IntegerField(min_value=0, max_value=10, widget=forms.Select)

   def __init__(self, *args, **kwargs):
       super(MyForm, self).__init__(*args, **kwargs)
       my_int = self.fields['my_integer']
       my_int.choices = [(i, i) for i in range(my_int.min_value, my_int.max_value)]

答案 1 :(得分:1)

这就是我通常做出特殊选择的方式:

def MyForm(forms.Form):
   INTEGER_CHOICES = [(i, i) for i in range(MIN_VALUE, MAX_VALUE)]
   my_integer = forms.ChoiceField(choices=INTEGER_CHOICES)

为了简单起见,我只是将min和max值放在顶部的变量中,而不是内省模型字段。

我使用ChoiceField而不是使用IntegerField。有关详细信息,请查看ChoiceField documentation。它们并不难使用。

答案 2 :(得分:1)

您可以在表单的 init 方法中定义字段,如下所示:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    initial = 40
    min_value = 10
    max_value = 100

    self.fields['the_field'] = forms.ChoiceField(choices=range(min_value, max_value + 1), initial=initial, validators=[MinValueValidator(min_value), MaxValueValidator(max_value)])