django ajax提交form表单数据

 

 

后台:  

from django.shortcuts import render
from django.shortcuts import redirect
from django.shortcuts import HttpResponse

from django import forms
# 模版
class LoginForm(forms.Form):
    # 模版中的元素
    user = forms.CharField(min_length=6,error_messages={"required": '用户名不能为空','min_length': '用户名长度不能小6'})
    email = forms.EmailField(error_messages={"required": '邮箱不能为空','invalid': '邮箱格式错误'})

class IndexForm(forms.Form):
    # 模版中的元素
    user = forms.CharField(min_length=6,error_messages={"required": '用户名不能为空','min_length': '用户名长度不能小6'})
    email = forms.EmailField(error_messages={"required": '邮箱不能为空','invalid': '邮箱格式错误'})
    favor = forms.MultipleChoiceField(
        choices=[(1,'小虎'),(2,'小小虎'),(3,'小B虎')]
    )

import json
from datetime import date
from datetime import datetime

def index(request):
    obj = IndexForm()
    return render(request,'index.html',{'obj': obj})

def edit_index(request):
    obj = IndexForm({'user': 'root','email': 'root@live.com','favor': [2,3]})
    return render(request,'index.html',{'obj': obj})


def login(request):
    if request.method == "GET":
        # 数据库中获取
        obj = LoginForm()
        return render(request,'login.html',{'oo': obj})
    elif request.method == "POST":
        """
        obj = LoginForm(request.POST)
        # 验证
        status = obj.is_valid()
        print(status)

        value_dict = obj.clean()
        print(value_dict)

        error_obj = obj.errors.as_json()
        print(error_obj)
        """
        obj = LoginForm(request.POST)
        if obj.is_valid():
            value_dict = obj.clean()
            print(value_dict)
            # create(**value_dict)
        else:
            # 封装了所有的错误信息
            # print(obj.errors['email'][0])
            # print(obj.errors["user"][0])
            # print(type(error_obj))
            from django.forms.utils import ErrorDict
            pass

        return render(request, 'login.html',{'oo': obj})


def login_ajax(request):
    if request.method == "GET":
        return render(request, 'login_ajax.html')
    elif request.method == "POST":
        ret = {'status': True, 'error':None, 'data': None}
        obj = LoginForm(request.POST)
        if obj.is_valid():
            print(obj.clean())
        else:
            # 方式一
            # res_str = obj.errors.as_json() # res_str是一个字符串
            # ret['status'] = False
            # ret['error'] = res_str
            # 两次反序列化
            # 方式二:
            ret['status'] = False
            ret['error'] = obj.errors.as_data() # # {'user': [ValidationError(['用户名长度不能小6'])], 'email': [ValidationError(['邮箱格式错误'])]}
            # # 一次反序列化
        return HttpResponse(json.dumps(ret,cls=JsonCustomEncoder))

from django.core.validators import ValidationError
class JsonCustomEncoder(json.JSONEncoder):
    def default(self, field):
        if isinstance(field, ValidationError):
            return {'code': field.code, 'message': field.message}
        else:
            return json.JSONEncoder.default(self, field)
"""
def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    elif request.method == "POST":
        # 不爽
        u = request.POST.get('user')
        e = request.POST.get('email')
        p = request.POST.get('pwd')
        # 判断用户输入是否为空,提示用户那个错误
        # ...
        # 判断某种格式是否正确,提示用户那个错误
        # ..
        # 数据库校验:
        # filter(user=u,email=e,pwd=p) # filter(**{})
        # create(user=u,email=e,pwd=p) # create(**{})
        # 只要上述条件有一个不满足,

        # 页面上一次提交的数据,无法保留(Form提交)
        return render(request,'login.html', {})
        # return redirect('/login.html')
"""
View Code

 

前端:

  login:

    

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Form提交数据</h1>
    <form method="POST" action="/login.html">
        <p>
            {{ oo.user }}
            <span>{{ oo.errors.user.0 }}</span>

        </p>
        <p>
            {{ oo.email }}
            <span>{{ oo.errors.email.0 }}</span>
        </p>
        <p>
            <input type="text" name="pwd" placeholder="密码" />
        </p>
        <input type="submit" value="提交"  /> {{ msg }}
        <input id="ajax_submit" type="button" value="Ajax提交"  />
    </form>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
        $(function () {
            
            $('#ajax_submit').click(function () {
                $.ajax({
                    url:"/login.html",
                    data: {user:'root', email: 'root@live.com', pwd: '123123'},
                    type: 'POST',
                    success:function (arg) {
                        console.log(arg)
                    }
                })

            })
            
        })
    </script>
</body>
</html>
View Code

  index:

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{ obj.user }}</p>
    <p>{{ obj.email }}</p>
    <p>{{ obj.favor }}</p>
</body>
</html>
View Code

  login_ajax:

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .error-msg{
            color: red;
            font-size: 12px;
        }
    </style>
</head>
<body>
    <h1>Form提交数据</h1>
    <form id="f1">
    <p>
        <input id="u" type="text" name="user" placeholder="用户名" />

    </p>
    <p>
        <input id="e" type="text" name="email" placeholder="邮箱" />
    </p>
    <p>
        <input id="p" type="text" name="pwd" placeholder="密码" />
    </p>
    <input id="ajax_submit" type="button" value="Ajax提交"  />
        </form>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
        $(function () {
            $('#ajax_submit').click(function () {
                $.ajax({
                    url:"/login_ajax.html",
                    //data: {user: $('#u').val(), email: $('#e').val(), pwd: $('#p').val()},
                    data: $('#f1').serialize(),
                    type: 'POST',
                    success:function (arg) {

                        $('.error-msg').remove();
                        var v1 = JSON.parse(arg);
                        console.log(v1);
                        if(!v1.status){
                            // var error_obj = JSON.parse(v1.error);
                            var error_obj = v1.error;
                            $.each(error_obj,function (k,v) {
                                // k: user 或 email
                                // v: [{}{}{},]
                                var tag = document.createElement('span');
                                tag.className = 'error-msg';
                                tag.innerHTML = v[0].message;
                                $("input[name='" + k +"']").after(tag);
                            })
                        }else{
                            location.href = "/index.html"
                        }
                        // { 'stauts': true, 'error':xx, 'data':’‘}
                    }
                })
            })
        })
    </script>
</body>
</html>
View Code

 

转载于:https://www.cnblogs.com/jiefangzhe/p/10791151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Django中自定义的表单多级联动,需要使用到`ModelForm`和JavaScript来实现。 首先,我们需要创建一个ModelForm,用于实现表单的自定义字段和验证规则。 ```python from django import forms from .models import ModelA, ModelB class MyForm(forms.ModelForm): class Meta: model = ModelA fields = '__all__' # 可根据实际需求选择需要的字段 def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) self.fields['second_model'] = forms.ModelChoiceField(queryset=ModelB.objects.none()) if 'first_model' in self.data: try: first_model_id = int(self.data.get('first_model')) self.fields['second_model'].queryset = ModelB.objects.filter(first_model_id=first_model_id) except (ValueError, TypeError): pass elif self.instance.pk: self.fields['second_model'].queryset = self.instance.first_model.modelb_set.order_by('name') ``` 在上面的例子中,`ModelA`是第一个模型,`ModelB`是第二个模型。在`MyForm`类的初始化方法中,根据`first_model`字段的值动态更新`second_model`字段的queryset,实现了多级联动。 接下来,我们需要在模板中添加HTML和JavaScript来实现多级联动效果。 ```html <form method="POST" action=""> {% csrf_token %} {{ form.as_p }} <button type="submit">Submit</button> </form> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script> $(document).ready(function() { $('#id_first_model').change(function() { var url = $(this).attr('data-href'); var first_model_id = $(this).val(); $.ajax({ url: url, data: { 'first_model_id': first_model_id }, success: function(data) { $('#id_second_model').html(data); } }); }); }); </script> ``` 在上面的例子中,我们使用了jQuery来监听`first_model`字段的变化事件。当`first_model`字段的值发生改变时,执行AJAX请求,获取到对应`second_model`字段的选项,并更新页面上的`second_model`字段。 总结来说,我们通过自定义的表单类`MyForm`来实现外键的多级联动,然后通过JavaScript的AJAX请求和动态更新页面的选项来实现表单的多级联动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值