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})
forms and views
    <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>
html

  效果图:

 

修改数据(实现数据自动填充):

//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})
forms and views
    <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>
HTML

 

注意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')
forms
<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>
html

  注意:choices input的值等同与 values_list的值 [(),(),()]

posted @ 2017-05-28 16:23  Vincen_shen  阅读(715)  评论(0)    收藏  举报