总结

  • 外键基本和普通的字段是一样的
  • 多对多
    • 获取 getlist()
    • 更新 clear() add() remove()
  • 前端和后端是通过字符串沟通的,所以使用ajax的时候如果是数据类型,记得要JSON转换

ForeignKey

后端处理

user_types = models.UserType.objects.all()  # 在template 中使用
data_to_tpl["user_types"] = user_types user_id = request.POST.get("id", None)
# print(type(request.POST.values()), request.POST.values()) to_update_dict = {}
to_update_dict["password"] = request.POST.get("password")
to_update_dict["phone"] = request.POST.get("phone")
to_update_dict["email"] = request.POST.get("email")
to_update_dict["user_type_id"] = request.POST.get("user_type_id")
front_hobbys = list(request.POST.getlist("hobbys")) # 获取select widget 的数据列表,如果使用get(), 那只会得到最后一个元素
print("---front_hobbys:", front_hobbys)
print("---to_update_dict", to_update_dict) # update
models.UserInfo.objects.filter(pk=user_id).update(**to_update_dict)
user_obj = models.UserInfo.objects.get(pk=user_id)
user_obj.hobby.clear() # 多对多, 先清除,在添加
user_obj.hobby.add(*front_hobbys) # 多对多, 先清除,在添加
user_obj.save() # save to databases

模板

form 方式提交

    模板语言动态生成:
<td>
<select name="user_type_id">
{% for user_type in user_types %}
{% if user.user_type_id == user_type %}
<option value={{ user_type.id }} selected="selected">{{ user_type.caption }}</option>
{% else %}
<option value={{ user_type.id }}>{{ user_type.caption }}</option>
{% endif %}
{% endfor %}
</select>
</td>

ajax 方式提交

这个简单,不写了

ManyToMany

后端处理

data_to_tpl["my_hobbys"] = user_obj.hobby.all()  # 注意,这里一定要有一个all出来的才是 queryset类型的数据

all_hobbys = models.Hobby.objects.all()  # 在template 中使用
data_to_tpl["all_hobbys"] = all_hobbys # 取数据 更新
front_hobbys = list(request.POST.getlist("hobbys")) # 注意,这里一定是getlist()
user_obj = models.UserInfo.objects.get(pk=user_id)
user_obj.hobby.clear()
user_obj.hobby.add(*front_hobbys)

模板

form 方式提交

 <tr>
<td>爱好</td>
<td>
<select name="hobbys" multiple="multiple" disabled="disabled" id="hobby_select">
{% for hobby in all_hobbys %}
{% if hobby in my_hobbys %}
<option value="{{ hobby.id }}" selected="selected">{{ hobby.title }}</option>
{% else %}
<option value="{{ hobby.id }}">{{ hobby.title }}</option>
{% endif %}
{% endfor %}
</select>
<a href="javascript:void(0)" onclick="deleteThisHobby(this)">编辑</a>
</td>
</tr>

ajax 方式提交

function uploadModifiedHobby(ths) {
var hobbys = $("#hobby_select").val();
hobbys_str = JSON.stringify(hobbys) // 要转换成字符串格式哦
console.log(hobbys_str)
$.ajax({
type:"POST",
url:"/chouti_like/delete_this_hobby/",
data:{"hobbys":hobbys_str,},
success:function (data) {
location.href = "/chouti_like/show_my_info/"
}
})
}

django ForeignKey ManyToMany 前后端联动的更多相关文章

  1. 【转】python+django+vue搭建前后端分离项目

    https://www.cnblogs.com/zhixi/p/9996832.html 以前一直是做基于PHP或JAVA的前后端分离开发,最近跟着python风搭建了一个基于django的前后端分享 ...

  2. python+django+vue搭建前后端分离项目

    以前一直是做基于PHP或JAVA的前后端分离开发,最近跟着python风搭建了一个基于django的前后端分享项目 准备工作:IDE,[JetBrains PyCharm2018][webpack 3 ...

  3. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  4. 全栈的自我修养: 001环境搭建 (使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发)

    全栈的自我修养: 环境搭建 Not all those who wander are lost. 彷徨者并非都迷失方向. Table of Contents @ 目录 前言 环境准备 nodejs v ...

  5. Django+element ui前后端不分离的博客程序

    最近把去年写的一个烂尾博客(使用了django1.11和element ui)又重新完善了一下,修改了样式和增加了新功能 github链接:https://github.com/ngauerh/Nag ...

  6. 解决Django+Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  7. Django前后端分离跨域请求问题

    一.问题背景 之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应 ...

  8. Django 前后端数据传输、ajax、分页器

    返回ORM目录 Django ORM 内容目录: 一.MTV与MVC模式 二.多对多表三种创建方式 三.前后端传输数据 四.Ajax ​ 五.批量插入数据 六.自定义分页器 一.MTV与MVC模式 M ...

  9. Django之META与前后端交互

    Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...

随机推荐

  1. [技术翻译]在现代JavaScript中编写异步任务

    本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...

  2. SaltStack之return与job管理

    目录 1. SaltStack组件之return 1.1 return流程 1.2 使用mysql作为return存储方式 2. job cache 2.1 job cache流程 2.2 job管理 ...

  3. Python调用cmd命令

    常用的两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结 ...

  4. 页面回显与URL模板映射

    一.页面回显 对于需要返回界面的数据,可以将后台封装好的数据回显至原始jsp界面中. 举个例子: User.java package com.zk.data; public class User { ...

  5. 【荐】CSS实现漂亮实用带箭头的流程图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. jQuery实现TAB选项卡切换特效简单演示

    本文实例为大家分享jQuery实现TAB选项卡切换特效,供大家参考,具体内容如下 1.tab切换 on ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  7. 1.Java多线程之wait和notify

    1.首先我们来从概念上理解一下这两个方法: (1)obj.wait(),当obj对象调用wait方法时,这个方法会让当前执行了这条语句的线程处于等待状态(或者说阻塞状态),并释放调用wait方法的对象 ...

  8. redis源码(八)redis-check-aof.c

    /* * Copyright (c) 2009-2012, Pieter Noordhuis <pcnoordhuis at gmail dot com> * Copyright (c) ...

  9. html集合

    <!DOCTYPE> //声明文档类型 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> ...

  10. 转载:HRTF virtaul surround

    https://blog.csdn.net/Filwl_/article/details/50503558 https://blog.csdn.net/lwsas1/article/details/5 ...