modelform中ChoiceField的默认值

时间:2012-11-01 14:01:48

标签: django django-forms

我有django的问题:
models.py:

SUSPEND_TIME = (
    ('0', '0'),
    ('10', '10'),
    ('15', '15'),
    ('20', '20'),


class Order(models.Model):  
    user = models.ForeignKey(User)  
    city = models.CharField(max_length=20)  
    ...
    processed = models.BooleanField(default=False)
    suspend_time = models.CharField(max_length=2, choices=SUSPEND_TIME, default='0')  
    ..

form.py:

class OrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ('suspend_time', 'processed')

view.py:

        try:
            order = Order.objects.get(id=order_id)
        except Order.DoesNotExist:
            order = None
        else:
            form = OrderForm(request.POST, instance=order)
            if form.is_valid():
            form.save()
            ....  

然后我发送ajax请求更新实例只有"processed" param ..
如果我不发送form.is_validFalse总是"suspend_time" ! 如果请求包含{'suspend_time': 'some_value' ...} form.is_valid,则为True 我不明白为什么? suspend_time有默认值..和订单。suspend_time总是有一些value: default或其他选项。
为什么在form = OrderForm(request.POST, instance=order) form['suspend_time'].value()None之后,其他字段(city, processed)具有正常值。

1 个答案:

答案 0 :(得分:1)

行为符合预期。表单应使用给定的数据进行验证。即,在表单中定义了所需的字段,应该存在于数据字典中以实例化它。 它不会使用实例中的数据来填充表单数据中未提供的字段。

来自django model forms

的文字

如果您正在构建一个数据库驱动的应用程序,那么您可能会拥有与Django模型紧密相关的表单。例如,您可能有一个BlogComment模型,并且您想要创建一个允许人们提交注释的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。

因此,Django提供了一个帮助器类,可以让你从Django模型创建一个Form类。