Form表单 创建 修改数据
forms.Form
创建数据:
通过Django Form自动生成input标签,并且进行有效性验证:
//forms from django import forms from django.forms import fields, widgets class UserForm(forms.Form): username = fields.CharField( required=True, error_messages={'required': "用户名不能为空"}, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) password = fields.CharField( required=True, error_messages={'required': "密码不能为空"}, widget=widgets.PasswordInput(attrs={'class': 'form-control'}) ) email = fields.EmailField( required=True, error_messages={'required': "邮箱不能为空", 'invalid': "邮箱格式错误"}, widget=widgets.EmailInput(attrs={'class': 'form-control'}) ) // views from .forms import UserForm class RegisterView(View): def get(self, request): obj = UserForm() return render(request, "register.html", {"obj": obj}) def post(self, request): obj = UserForm(request.POST) if obj.is_valid(): print("通过验证", obj.cleaned_data) else: return render(request, "register.html", {'obj': obj})
<div class="col-md-4 col-md-offset-4"> <form method="post" action="{% url "register" %}"> <div class="form-group"> <label for="exampleInputEmail1">Username</label> {{ obj.username }} <span>{{ obj.errors.username.0 }}</span> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> {{ obj.password }} <span>{{ obj.errors.password.0 }}</span> </div> <div class="form-group"> <label for="exampleInputEmail1">Email address</label> {{ obj.email }} <span>{{ obj.errors.email.0 }}</span> </div> <button type="submit" class="btn btn-default">Submit</button> {% csrf_token %} </form> </div>
效果图:

修改数据(实现数据自动填充):
//forms from django import forms from django.forms import fields, widgets class UserForm(forms.Form): username = fields.CharField( required=True, error_messages={'required': "用户名不能为空"}, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) password = fields.CharField( required=True, error_messages={'required': "密码不能为空"}, widget=widgets.PasswordInput(attrs={'class': 'form-control'}) ) email = fields.EmailField( required=True, error_messages={'required': "邮箱不能为空", 'invalid': "邮箱格式错误"}, widget=widgets.EmailInput(attrs={'class': 'form-control'}) ) // Views from .forms import UserForm class EditUser(View): def get(self, request, uid): user = User.objects.filter(id=uid).first() obj = UserForm(initial={'username': user.username, 'password': user.password}) return render(request, "user_edit.html", {'uid': uid, 'obj': obj}) def post(self, request, uid): obj = UserForm(data=request.POST) if obj.is_valid(): User.objects.filter(id=uid).update(**obj.cleaned_data) return redirect(reverse("user_home")) return render(request, "user_edit.html", {'uid': uid, 'obj': obj})
<div class="col-md-4 col-md-offset-4"> <form method="post" action="{% url "edit_user" uid %}"> <div class="form-group"> <label for="exampleInputEmail1">Username</label> {{ obj.username }} <span>{{ obj.errors.username.0 }}</span> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> {{ obj.password }} <span>{{ obj.errors.password.0 }}</span> </div> <div class="form-group"> <label for="exampleInputEmail1">Email address</label> {{ obj.email }} <span>{{ obj.errors.email.0 }}</span> </div> <button type="submit" class="btn btn-default">Submit</button> {% csrf_token %} </form> </div>
注意ForeignKey字段
如果页面中有展示ForeignKey字段,默认不会自动去数据库取最新内容,数据库新增了数据,Form也不会自动去取。
因此需要在Form类中重载init方法,在init方法中取数据库中的数据。
这里的ForeignKey需要只用select choice字段(下拉式单选)
from django import forms from django.forms import fields, widgets from .models import UserType class UserForm(forms.Form): username = fields.CharField( required=True, error_messages={'required': "用户名不能为空"}, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) password = fields.CharField( required=True, error_messages={'required': "密码不能为空"}, widget=widgets.PasswordInput(attrs={'class': 'form-control'}) ) email = fields.EmailField( required=True, error_messages={'required': "邮箱不能为空", 'invalid': "邮箱格式错误"}, widget=widgets.EmailInput(attrs={'class': 'form-control'}) ) um_id = fields.IntegerField( required=True, widget=widgets.Select( attrs={'class': 'form-control'}, choices=[], ) ) //重载init方法,每次调用form的时候都会从UserType中获取数据 def __init__(self, *args, **kwargs): super(UserForm, self).__init__(*args, **kwargs) self.fields['um_id'].widget.choices = UserType.objects.values_list('id', 'name')
<div class="col-md-4 col-md-offset-4"> <form method="post" action="{% url "register" %}"> <div class="form-group"> <label>Username</label> {{ obj.username }} <span>{{ obj.errors.username.0 }}</span> </div> <div class="form-group"> <label>Password</label> {{ obj.password }} <span>{{ obj.errors.password.0 }}</span> </div> <div class="form-group"> <label>Email address</label> {{ obj.email }} <span>{{ obj.errors.email.0 }}</span> </div> <div class="form-group"> <label>User Type</label> {{ obj.ut_id }} <span>{{ obj.errors.ut_id.0 }}</span> </div> <button type="submit" class="btn btn-default">Submit</button> {% csrf_token %} </form> </div>

浙公网安备 33010602011771号