使用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。
有没有方便的方法呢?我可以改变某处提交的数据吗?或者我应该采取不同的方法吗?
答案 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
会更方便方式。