如何使用Django中的复选框在MySQL中输入1或0?

时间:2014-08-04 21:04:12

标签: python mysql django django-forms django-crispy-forms

使用inspectdb,我有User表的以下模型:

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(unique=True, max_length=128)
    active = models.IntegerField(blank=True, null=True)
    created_date = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'user'

我想创建一个简单的表单,使用Crispy Forms添加新的User,但使用默认字段active成为数字输入字段,而我更愿意拥有它是一个复选框。不幸的是,只需将字段设置为CheckboxInput就不会将其剪切,因为它不会自动将开/关状态更改为1/0。这是我的上下文表格:

class CreateUserForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(CreateUserForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-lg-3 col-md-2 col-sm-2'
        self.helper.field_class = 'col-lg-6 col-md-8 col-sm-10'
        self.helper.layout = Layout(
            'name',
            'active',
            FormActions(
                Submit('submit', 'Submit'),
                HTML('<a class="btn btn-default" href="{% url "app:user:list" page="1" %}">Cancel</a>'),
            ),
        )

    class Meta:
        model = User
        fields = ['name', 'active']
        widgets = {
            'note': Textarea(attrs={'cols': 23, 'rows': 4}),
            'active': CheckboxInput()
        }

注意:所有class es都适用于Twitter Bootstrap。

有没有方便的方法呢?我可以改变某处提交的数据吗?或者我应该采取不同的方法吗?

2 个答案:

答案 0 :(得分:3)

使用BooleanField代替IntegerField。这并不需要更改数据库表,因为BooleanField在内部将布尔值转换为1和0。 MySQL&#34; boolean&#34;列类型只不过是tinyint(1)的别名,即用作1/0真值的整数类型。您也可以使用其他整数列类型执行此操作。

答案 1 :(得分:0)

您可以在表单中添加clean_active方法以规范化输入:

class CreateUserForm(ModelForm):
    ...

    def clean_active(self):
        return 1 if self.cleaned_data['active'] else 0

另请参阅:cleaning and validating form input in Django

但是,您也应该问自己真的需要以这种方式在MySql中表示您的数据。对于该字段使用BooleanField而不是IntegerField会更方便方式