djangomodelform操作及验证ajax操作文件上传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了djangomodelform操作及验证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>

 

以上是关于djangomodelform操作及验证ajax操作文件上传的主要内容,如果未能解决你的问题,请参考以下文章

tp框架表单验证 及ajax

kettle安装部署基本操作及实操文档

为啥我的 Django ModelForm 不会引发 unique_together 约束的验证错误?

Ajax和PHP正则表达式验证表单及验证码

form组件注册ajax登录auth认证及验证码

Django ModelForm:save(commit=False) 用于啥?