首页 > 代码库 > django(7)modelform操作及验证、ajax操作、文件上传

django(7)modelform操作及验证、ajax操作、文件上传

一、modelForm操作及验证

1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据

views.py

from django.shortcuts import render,HttpResponse
from app01 import models

from django import forms
from django.forms import fields as Ffields
from django.forms import widgets as Fwidgets
class UserInfoModelForm(forms.ModelForm):
    class Meta:#必须添加
        model = models.UserInfo#指定去UserInfo表里获取数据
        fields = __all__  #在界面显示所有字段
        # fields =  [‘username‘,‘email‘]#只在界面显示‘username‘,‘email‘字段
        # exclude = [‘username‘]  #不在界面显示‘username‘字段

class UserInfoForm(forms.Form):
    username = Ffields.CharField(max_length=32)
    email = Ffields.EmailField()
    user_type = Ffields.ChoiceField(
        choices=models.UserType.objects.values_list(id,caption)#以‘id‘,‘caption‘为select框中的数据
    )

    def __init__(self, *args, **kwargs):
        super(UserInfoForm,self).__init__(*args, **kwargs)
        self.fields[user_type].choices = models.UserType.objects.values_list(id,caption)#加上这个init函数
            #后,就能将新添加到数据库中的数据动态显示到select框啦

def index(request):
    if request.method == "GET":#将数据展示在界面
        obj = UserInfoModelForm()
        return render(request,index.html,{obj: obj})
    elif request.method == "POST":#获取前端提交的数据
        obj = UserInfoModelForm(request.POST)
        if obj.is_valid():#obj.is_valid()只能为true或false
         print(obj.is_valid())
         print(obj.cleaned_data) #obj.cleaned_data以字典的形式展示前端提交的数据
         print(obj.errors.as_json())#打印错误信息
        return render(request,index.html,{obj: obj})

index.html

技术分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/index/" method="POST">
        {% csrf_token %}
        {{ obj.as_p }}  #以p标签的形式展示数据
        <input type="submit" value="提交" />
    </form>
</body>
</html>
View Code

二、完整的在界面展示数据、修改数据、提交数据、跳转到新页面

views.py

from django.shortcuts import render,HttpResponse
from app01 import models

from django import forms
from django.forms import fields as Ffields#给导入的fields设置别名为Ffields
from django.forms import widgets as Fwidgets#给导入的widgets设置别名为Fwidgets
class UserInfoModelForm(forms.ModelForm):

    is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())#自定义在界面显示的单选框等,而且不用保存在数据库

    class Meta:#class  Meta里一定不要加逗号
        model = models.UserInfo#指定去UserInfo表里获取数据
        fields = __all__  #在界面显示所有字段
        # fields =  [‘username‘,‘email‘]#只在界面显示‘username‘,‘email‘字段
        # exclude = [‘username‘]  #不在界面显示‘username‘字段
        labels = {#设定输入框的标签名
            username: 用户名,
            email: 邮箱,
        }
        help_texts = {#在输入框后面自定义帮助信息
            username: 我是帮助信息
        }
        widgets = {#自定义输入框的属性,即自定义html标签的class
            username: Fwidgets.Textarea(attrs={class: c1})#将输入框设置为text文本框,并添加css:‘c1’
        }
        error_messages = {#自定义错误信息提示
            __all__:{#给整体设置错误信息,跟form中的all一样

            },
            email: {#给每个字段设定错误信息
                required: 邮箱不能为空,
                invalid: 邮箱格式错误..,
            }
        }
        field_classes = {#将email输入框的格式验证修改为必须输入URL格式才正确
            # ‘email‘: Ffields.URLField
        }

        localized_fields=(ctime,)#将数据库时间转化为北京时间,括号里写需要转化时间的字段,需要在settings里设置
         #timezone

class UserInfoForm(forms.Form):
    username = Ffields.CharField(max_length=32)
    email = Ffields.EmailField()
    user_type = Ffields.ChoiceField(
        choices=models.UserType.objects.values_list(id,caption)#以‘id‘,‘caption‘为select框中的数据
    )

    def __init__(self, *args, **kwargs):
        super(UserInfoForm,self).__init__(*args, **kwargs)
        self.fields[user_type].choices = models.UserType.objects.values_list(id,caption)#加上这个init函数
            #后,就能将新添加到数据库中的数据动态显示到select框啦


def index(request):#将数据展示在界面
    if request.method == "GET":
        obj = UserInfoModelForm()
        return render(request,index.html,{obj: obj})
    elif request.method == "POST":
        obj = UserInfoModelForm(request.POST)
        if obj.is_valid():#obj.is_valid()只能为true或false
            obj.save()#自动将前端提交的数据保存在数据库

        # print(obj.cleaned_data) #obj.cleaned_data以字典的形式获取前端提交的数据
        # print(obj.errors.as_json())
        return render(request,index.html,{obj: obj})


def user_list(request):
    li = models.UserInfo.objects.all().select_related(user_type)#获取UserInfo表中的所有数据,并且跨表将与UserInfo
    # 关联的user_type表中的数据也取出来,注意括号中写UserInfo类中的关联字段名,不可以写多对多的字段名,否则报错,
    #前端html跨表取user_type表数据:{% for row in li %}   {{ row.user_type.caption }}
    return render(request,user_list.html,{li: li})

def user_edit(request, nid):
    # 1.获取当前id对应的用户信息
    # 2.显示用户已经存在数据
    if request.method == "GET":#数据展示
        user_obj = models.UserInfo.objects.filter(id=nid).first()#根据nid获取UserInfo表中的相关数据的第一条
        mf = UserInfoModelForm(instance=user_obj)#将mf传到前端就可以自动生成网页,括号中的instance参数是显示默认值
        return render(request,user_edit.html,{mf: mf, nid: nid})#跳转回本页面,也可以跳转到其他页面
    elif request.method == POST:#数据修改
        user_obj = models.UserInfo.objects.filter(id=nid).first()
        mf = UserInfoModelForm(request.POST,instance=user_obj)#如果不加这句,就会自动在数据库中新添加数据,而不是修改
        #已存在的数据
        if mf.is_valid():
            mf.save()#将修改的数据写入到数据库中
        else:#如果出现异常,打印错误信息
            print(mf.errors.as_json())
        return render(request,user_edit.html,{mf: mf, nid: nid})

urls.py

    url(r^admin/, admin.site.urls),
    url(r^index/, views.index),
    url(r^user_list/, views.user_list),
    url(r^edit-(\d+)/, views.user_edit),

index.html

同上

user_list.html

技术分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
        <ul>
            {% for row in li %}
                <li>{{ row.username }} - {{ row.user_type.caption }} - <a href="/edit-{{ row.id }}/">编辑</a></li>
            {% endfor %}
        </ul>
</body>
</html>
View Code

user_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form method="POST" action="/edit-{{ nid }}/"> #以新链接的形式提交数据
        {% csrf_token %}
    {{ mf.as_p }}
        <input type="submit" value="提交" />
    </form>

</body>
</html>

 

django(7)modelform操作及验证、ajax操作、文件上传