首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Django和AJAX表单更新模型值的最简单方法

使用Django和AJAX表单更新模型值的最简单方法
EN

Stack Overflow用户
提问于 2019-02-08 18:49:29
回答 2查看 641关注 0票数 0

我有一个django模型,它包含一些字段和相关的选项:

代码语言:javascript
运行
AI代码解释
复制
class Product(models.Model):
    CONDITION_CHOICES = (
        ("GOOD", "Good"),
        ("BAD", "Bad"),
        ("UNKNOWN", "Unknown"),
    )

    name = models.CharField(max_length=200, blank=True, null=True)
    colour = models.CharField(max_length=200, blank=True, null=True)

    condition = models.CharField(max_length=20, choices=CONDITION_CHOICES, blank=True, null=True)
    condition_source = models.CharField(max_length=20, blank=True, null=True)
    condition_last_updated = models.DateTimeField(blank=True, null=True)

我还有一个bootstrap驱动的表单,如下所示:

代码语言:javascript
运行
AI代码解释
复制
<div class="form-group">
    <label class="control-label"><strong>Condition</strong></label>
    <br/>
    <div class="btn-group btn-group-toggle" data-toggle="buttons">
        <label class="btn btn-outline-primary">
            <input type="radio" name="condition" value="GOOD" autocomplete="off">
            Good
        </label>
        <label class="btn btn-outline-primary">
            <input type="radio" name="condition" value="BAD" autocomplete="off">
            Bad
        </label>
        <label class="btn btn-outline-primary">
            <input type="radio" name="condition" value="UNKNOWN" autocomplete="off">
            Unknown
        </label>
    </div>
</div>

我正在尝试这样做,这样当用户单击UI中的一个按钮时,产品模型就会更新(特别是condition、condition_source和condition_last_updated字段)。实际的模型有多个字段与选择选项相关联,所以我希望模型在用户处理表单时实时更新,而无需重新加载页面。

任何指导都将在这里被感谢-我已经看过intercooler.js,但不确定这是不是适合这项工作的工具。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-08 20:37:37

由于您尚未指定condition_source应包含的内容,因此我已将其设置为string some_source

Ajax:

代码语言:javascript
运行
AI代码解释
复制
$('.btn').on('click', function(){
    $.post(
           '/your_vew/',
           {
             'source': "some_source",
             'condition': $(this).find('input').val(),
             'csrfmiddlewaretoken': '{{csrf_token}}'
           },
           function(data){
              console.log(data.response);
           }
     );    
});  

urls.py:

代码语言:javascript
运行
AI代码解释
复制
urlpatterns = [
    ...
    path('your_vew/', views.your_view), 
    ...
]

views.py:

代码语言:javascript
运行
AI代码解释
复制
from django.http import JsonResponse
from datetime import datetime

def your_view(request):
    data = {'response': ''}
    if request.method == 'POST':
        p1 = Product.objects.filter(pk=1).update(
              condition_source=request.POST.get('source'),
              condition=request.POST.get('condition'),
              condition_last_updated=datetime.now()
            )
        if p1:
            data['response'] = 'Record updated!'    
    return JsonResponse(data) 
票数 0
EN

Stack Overflow用户

发布于 2019-02-08 20:31:38

现在,您有几个选择。我所做的就是以类的形式使用Jquery ajax方法,并在这个类中为我的应用程序设置函数。Django需要csrf令牌来处理传入请求。因此,我找到了这两个函数,它们从客户端检索cookie csrf令牌。

代码语言:javascript
运行
AI代码解释
复制
    function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

将csrf令牌存储在变量中后,您需要将其传递给ajax beforeSend函数,例如:

代码语言:javascript
运行
AI代码解释
复制
ajax_setup(enable_async){
    enable_async = true;
    $.ajaxSetup({
    async: enable_async,
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    }
    });
}
}

完整的ajax请求如下所示

代码语言:javascript
运行
AI代码解释
复制
update_user_language(user_id, lang, callback){
    this.ajax_setup(true);
    $.ajax({
        url: this.url,
        type: "POST",
        data: {
            'user_id':user_id,
            'lang':lang,
        },
        dataType: 'json',
        success: function(data){
            db_request_after();
            if(callback !== undefined) callback(data);
        },
        error: function(){
            db_request_error();
        },
    });
}

请注意回调变量。这允许ajax调用传递从the服务检索到的数据的函数。

一旦发送了请求,就需要设置view.py来接受请求并处理POST变量。

代码语言:javascript
运行
AI代码解释
复制
def sample_view(request):
   if request.method == "POST"
       user_id = request.POST.get('user_id')
       lang = request.POST.get('lang')
       #update the model value
       user = User.objects.get(pk=user_id)
       user.language = lang
       user.save()
       return JsonResponse({'message':'user updated'})
   else:
       return render(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54598544

复制
相关文章
使用ajax方法实现form表单的提交
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载。 写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说想要将控制权放在前端,通过js来操作页面的跳转或者数据变化。 一般这种异步的操作,我们都会想到ajax方式,因此在实现了功能后就整理了这篇文章,通过ajax方法实现for
程序员十三
2018/03/15
3.2K0
最简单的BERT模型调用方法
当然,实现起来是有一些tricky的,而且tokenizer并不是真正的bert的tokenizer,中文大部分不会有太大问题,英文的话实际上因为考虑BPE,所以肯定是不行的。
段清华DEAN
2020/02/14
3K0
Django ajax 简单介绍
Asynchronous Javascript And XML是 "异步Javascript和XML"。即使用 Javascript 语言与服务器进行异步交互,传输的数据为XML。
py3study
2020/01/15
5700
Django ajax 简单介绍
Flexbox 布局的最简单表单
弹性布局(Flexbox)逐渐流行,越来越多人使用,因为它写 CSS 布局真是太方便了。
ruanyf
2018/10/25
1.6K0
Flexbox 布局的最简单表单
最简单的 Django 教程
web框架:别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。
Python小二
2022/08/24
1.4K0
最简单的 Django 教程
django-表单之模型表单(三)
models.py-->forms.py-->views.py(get)--index.html-->views.py(post)-->home.html
西西嘛呦
2020/08/26
5410
最简单的AJAX初级教程
    项目实现目标:验证邮箱是否已经注册 项目实现过程:用户注册页面输入完邮箱后即时提醒邮箱是否可以注册 先来看html表单代码
世纪访客
2018/08/02
4770
最简单的AJAX初级教程
Django 分页和使用Ajax5.3
分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数 属性 count:对象总数 num_pages:页面总数 page_range:页码列表,从1开始,例如[1, 2, 3, 4] 方法 page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常 异常exception InvalidPage:当向page()传入一个
Lansonli
2021/10/09
3.1K0
django-表单之模型表单渲染(六)
class StudentForms(forms.ModelForm): formats=[ '%Y-%m-%d', '%m/%d/%Y', ] birthday = forms.DateField(label='出生日期', input_formats=formats) class Meta: model=Student # fields='__all__' # exclude=['is_del
西西嘛呦
2020/08/26
4550
Django实现任意文件上传(最简单的方法)
利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现。 第一步:在模板文件中,创建一个form表单,需要特别注意的是,在有文件上传的form表单中,method属性必须为post,而且必须指定它的enctype为"multipart/form-data",表明不对字符进行编码,具体的代码如下: <form enctype="multipart/form-data" action="/upload
用户1214487
2018/01/24
5.8K0
Django实现任意文件上传(最简单的方法)
django--ajax的使用,应用
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
测试开发社区
2019/09/20
8340
django--ajax的使用,应用
django--ajax的使用,应用
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
py3study
2018/08/03
1.1K0
使用信号监控 Django 模型对象字段值的变化
Django 信号 (Signals) 的功能类似于 WordPress 的动作 (action),用于为项目全局增加事件的广播 (dispatch) 与接收 (receive) 机制。其中,灵活使用其内置的模型信号 (Model Signals) 的接收功能就可以监控大部分模型对象 (Model instances) 的变化。因为不需要修改模型本身的代码,在进行跨应用 (App) 监控时有低耦合的优势。
BigYoung小站
2020/05/05
1.9K0
jquery实现ajax提交form表单的方法总结
方法一: function AddHandlingFeeToRefund() { var AjaxURL= "../OrderManagement/AjaxModifyOrderService.aspx"; alert($('#formAddHandlingFee').serialize()); $.ajax({ type: "POST",
PM吃瓜
2019/08/12
2.1K0
python测试开发django-109.ModelForm模型表单的使用
django的表单有2种:forms.Form 和 forms.ModelForm。ModelForm顾名思义是将模型和表单结合起来,这个功能是非常强大的!
上海-悠悠
2021/07/22
1.1K0
Django更新数据模型
在更新模型的时候遇到问题,网上有说删app下migrations目录的,有说要删数据库django_migrations表的, 还有的要在数据库中更改字段的。
Spaceack
2020/11/04
1.1K0
Django——简单使用Django
改变settings.py文件为上所示,之后再次启动Django项目,可以看到,页面如下所示。
zy010101
2021/01/07
8770
Django——简单使用Django
Java Ajax简单使用
写一个简单的Ajax:一个输入框输入值判断,如果输入值 == "sakura" 后面显示名字不可用,否则显示可用
SakuraTears
2022/01/13
5260
Mybatis 入门 -- 最简单的引入和使用
参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html 从今天开始学习官方文档。 1.项目搭建 项目结构: 首先,搭建一个maven项目
Ryan-Miao
2018/03/13
8210
Mybatis 入门 -- 最简单的引入和使用
最简单的基于jquery的ajax请求教程
上一次文章提到ajax异步请求的简单教程。那是基于原生JavaScript实现的。本次是基于jquery的ajax异步请求教程。
世纪访客
2018/08/02
4850
最简单的基于jquery的ajax请求教程

相似问题

使用Django/South重命名模型的最简单方法?

446

使用Ajax jQuery提交Django表单的简单方法

20

Django forms:为继承模型组织创建/更新表单的最干练的方法

10

使用AJAX更新Django模型

11

使用Django表单更新Django模型

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档