models.py
class Department(models.Model):
# '''部门表'''
title = models.CharField(verbose_name='标题', max_length=32)
def __str__(self):
return self.title
class UserInfo(models.Model):
''' 员工表 '''
name = models.CharField(verbose_name='姓名', max_length=16)
password = models.CharField(verbose_name='密码', max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='账户余额', max_digits=10, default=0, decimal_places=2)
create_time = models.DateTimeField(verbose_name='入职时间')
depart = models.ForeignKey(verbose_name="部门", to='Department', to_field="id", on_delete=models.CASCADE)
gender_choices = (
(1, '男'),
(2, '女'),
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
views.py
from django import forms
class UserModelForm(forms.ModelForm):
name = forms.CharField(min_length=3, label="用户名")
class Meta:
model = models.UserInfo
fields = ['name', 'password', 'age', 'account', 'create_time', 'gender', 'depart']
def __init__(self, *args, **kwargs): # 重新定义函数,循环标签,改变样式
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {'class': 'form-control', "placeholder": field.label}
def user_add(request):
"""添加用户"""
if request.method == "GET":
form = UserModelForm() # 实例化
return render(request, 'user_form.html', {'form': form})
# 数据校验
form = UserModelForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('/user/list/')
return render(request, 'user_form.html', {'form': form})
html
<form class="form-horizontal" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label>{{field.label}}</label>
{{field}}
<span style="color: red;" >{{field.errors.0}}</span>
<!--<input type="text" class="form-control" placeholder="标题" name="title" />-->
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提 交</button>
</form>
解释
使得打印Department对象时,打印内容为title。
- ModelForm对象传到html页面。是一个迭代对象,需要循环输出。每一个循环出来的单体相当于一个封装好的标签。故若想要改变标签的样式等,可以在创建对象那里改变,如下图。
.items()返回字典的键值对。
数据校验
通过POST请求获取到输入的数据。返回的modelform对象中也包含了是否输入错误的信息。如果正确,则保存到数据库。如果错误,则在页面显示。
需要使用
settings中设置中文
关于输入可选
创建时,就以Id关联着另一个表。相当于获得了关联表对象。 而关联表中,有多行数据,传进html时,就自动生成选项。
加下面后,才变为最终效果。