文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、ModelForm是什么?
ModelForm是一个强大的组件,可以在用户输入时做一些校验,也可以在下拉框做出一些提示
二、使用步骤
1.导入form库
from django import forms
2.定义自己的ModelForm
class PrettyModelForm(forms.ModelForm):
class Meta:
model = models.PrettyNumber
fields = ['mobile', 'price', 'level']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {'class': "form-control"}
__init__是初始化时,可以给输入框添加样式
3.在自己的views.py里面定义自实列自己的ModelForm
def prettyadd(request):
if request.method == 'GET':
form = PrettyModelForm()
return render(request, 'pretty_add.html', {'form': form})
form = PrettyModelForm(data=request.POST)
if form.is_valid():
form.instance.status = 2
form.save()
return render(request, 'pretty_add.html', {'form': form})
可以看到如果在定义类的时候,fields字段里面不是model类里面的所有字段,而在保存的时候又想保存一些不用用户自己输入的字段,就可以这样写form.instance.字段名 = ***, 这样就可以不用用户输入,也可以保存。
4.如何用ModelForm更新字段
代码如下:
def useredit(request, id):
""" 用户编辑 """
row_obj = models.UserInfo.objects.filter(pk=id).first()
if request.method == "GET":
form = UserModelForm(instance=row_obj)
return render(request, 'user_edit.html', {'form': form})
form = UserModelForm(data=request.POST, instance=row_obj)
if form.is_valid():
form.save()
return redirect(reverse('userlist'))
return render(request, 'user_edit.html', {'form': form})
一样使用save方法,但通过POST传来数据时,需要在实列话时加一个instance=rowobj(数据库要更新的那一行)。
5.如何在前端模板中使用
代码如下:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"> 新建用户 </h3>
</div>
<div class="panel-body">
<form 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>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>
</div>
{% endblock %}
field.label是models的verbose_name, 而field可以自动的生成相应的输入框,而field.error.0是在界面生成相应的报错信息。
6.对输入进行格式匹配
1.字段加正则
from django.core.validators import RegexValidator
class PrettyModelForm(forms.ModelForm):
mobile = forms.CharField(
label = '手机号',
validators=[RegexValidator(r'^\d{11}$', '数字要是手机号')],
)
class Meta:
model = models.PrettyNumber
fields = ['mobile', 'price', 'level']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {'class': "form-control"}
2.钩子方法
总结
对ModelForm的相关总结