Django的form表单和ajax

    在web开发中,表单提交是一个很常见的功能,在django中,使用form表单提交较为简单,需要注意在表单中添加{% csrf_token %},如果不想这样做,也可以在对应的view方法中添加装饰器@csrf_exempt,强制不使用csrf认证。

    如果是ajax提交表单,则相对复杂一些,在ajax提交时,除了提交你的表单内容数据,还要添加一个请求头数据, headers:{"X-CSRFToken":$.cookie("csrftoken")},$.cookie("csrftoken")使用了jquery的cookie框架,可以方便的获取cookie数据。如果不加上这个请求头,那么请求将会失败,且是400系列的请求异常。

    那么废话不多说,直接上代码吧(分别演示form表单和ajax提交的情况):

    urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index),
    path('add_blog',views.add_blog,name='add_blog')
]

    views.py:

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render, render_to_response


# Create your views here.
def index(request):
    return render(request,'index.html')

def add_blog(request):
    if request.is_ajax():
        title = request.POST.get('title')
        content = request.POST.get('content')
        data = {}
        data['status'] = '0'
        data['message'] = '传递数据成功'
        data['data'] = {'title':title,'content':content}
        return JsonResponse(data)
    else:
        title = request.POST.get('title')
        content = request.POST.get('content')
        print(title)
        print(content)
        return render(request, 'index.html', locals())

index.html:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>以form方式添加博客</h1>
    <form action="{% url 'add_blog' %}" method="post">
        {% csrf_token %}
        <label>博客标题</label>
        <input type="text" name="title">
        <label>博客内容</label>
        <input type="text" name="content">
        <button  type="submit">添加</button>
    </form>
    <h4>提交的数据:title:{{ title }},content:{{ content }}</h4>

    <h1>以ajax方式添加博客</h1>
    <label>博客标题</label>
    <input type="text" id="title">
    <label>博客内容</label>
    <input type="text" id="content">
    <button type="button" id="commit_btn">添加</button>
    <div id="ajax_ret"></div>
</body>

<script src="{% static 'jquery-1.12.4.min.js' %}"></script>
<script src="{% static 'jquery.cookie.js' %}"></script>

<script>
    $("#commit_btn").click(function () {
        $.ajax({
                url:'{% url 'add_blog' %}',
                method:'post',
                data:{title:$("#title").val(),content:$('#content').val()},
                headers:{"X-CSRFToken":$.cookie("csrftoken")},
                success:function (data) {
                    $('#title').val('')
                    $('#content').val('')
                    $('#ajax_ret').html("<H4>后台返回的数据:状态码:"+data.status+",说明信息:"+data.message+",返回数据:"+data.data.title+","+data.data.content+"</H4>")
                },
                error:function (data) {
                    alert(data.status)
                }
            }
        )
    })

</script>

</html>

好了,来看张页面截图吧:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现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请求和动态更新页面的选项来实现表单的多级联动效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值