django-xadmin根据当前登录用户动态设置表单字段默认值方式


Posted in Python onMarch 13, 2020

相信你一定会设置一个普通字段的默认值:

class Offer(models.Model):
salary = models.CharField(max_length=64, blank=True, default='6000', verbose_name='薪资待遇')

相信你还能动态设置外键字段的默认值:

class Interview(models.Model):
  department = models.ForeignKey('departments.Department', related_name='interview',
                  on_delete=models.PROTECT, default=get_department, verbose_name='面试部门')
 
def get_department():
  department = Department.objects.get(name='管理部')
  return department.id

但是以上都是从数据库模型层面修改,数据层面的修改有个缺点,就是针对所有用户都设置成同一个默认值

如果我想根据当前登录用户的身份来动态设置默认值呢?

要解决这个问题就不能从数据库层面来设置了,而要在adminx.py文件中去设置。

class Interview(models.Model):
  hruser = models.ForeignKey(HrUser, related_name='interview', on_delete=models.PROTECT, verbose_name='姓名')
  department = models.ForeignKey('departments.Department', related_name='interview', on_delete=models.PROTECT, verbose_name='面试部门')
  creator = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='creator', on_delete=models.PROTECT, verbose_name='创建者')
 
@register(Interview)
class InterviewAdmin(InterviewSrv):
  list_display = ('hruser', 'status', 'department', 'creator', ...)
  list_per_page = 50
  ...
  # 需要重写instance_forms方法,此方法作用是生成表单实例
  def instance_forms(self):
    super().instance_forms()
    # 判断是否为新建操作,新建操作才会设置creator的默认值
    if not self.org_obj:
      self.form_obj.initial['creator'] = self.request.user.id

最终效果:

创建者会根据当前登录用户自动填入

django-xadmin根据当前登录用户动态设置表单字段默认值方式

补充知识:Django通过Ajax利用FormData动态提交表单(包括文件,字符串)

0 需求背景

有的时候我们上传表单,经过后台处理之后再分发回原来页面,这时必定会刷新这个页面。为了解决这个问题,我们采用JS动态提交表单元素,如:file、text等类型,可以很好的解决这一问题。

1 DOM结构

<form method="post" enctype="multipart/form-data"">
 <input id="subject" type="text" class="form-control" >
 <input id="excels" type="file">
 <select class="form-control" id="models">
 <option>model0</option>
 <option>model1</option>
 </select>
 <input id="con" type="file">
 <input type="button" id="showyulan" value="上传">
</form>

2 JS代码

$('#showyulan').click(function () {
    var formData = new FormData();
    formData.append('subject', $('#subject').val())
    formData.append('excels', document.getElementById("excels").files[0])
    formData.append('models', $('#models').val())
    formData.append('con', document.getElementById("con").files[0])
    formData.append('qunfasum', $('#qunfasum').val())
    formData.append('jiange', $('#jiange').val())
    formData.append('yuming', $('#yuming').val())
    formData.append('duankou', $('#duankou').val())

    $.ajax({
        url:"/showyulan/",
        type:"POST",
        data:formData,
        processData:false,
        contentType:false,
        success: function (data) {
          alert(data)
        }
    })
  })

3 Django后台代码

def showyulan(request):
  subject = request.POST.get('subject')

  f1 = request.FILES.get('excels')
  
  # 文件保存路径
  fname = '%s/excel/%s' % (settings.MEDIA_ROOT, f1.name)
  with open(fname, 'wb') as pic:
    for c in f1.chunks():
      pic.write(c)

  models = request.POST.get('models')

  f2 = request.FILES.get('con')
  
  # 文件保存路径
  fname = '%s/text/%s' % (settings.MEDIA_ROOT, f2.name)
  with open(fname, 'wb') as pic:
    for c in f2.chunks():
      pic.write(c)
      
  return HttpResponse('上传成功!')

以上这篇django-xadmin根据当前登录用户动态设置表单字段默认值方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
python 实现删除文件或文件夹实例详解
Dec 04 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
python如何求解两数的最大公约数
Sep 27 Python
python实现五子棋小程序
Jun 18 Python
python腾讯语音合成实现过程解析
Aug 01 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
Python如何输出整数
Jun 07 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 #Python
Django choices下拉列表绑定实例
Mar 13 #Python
django model object序列化实例
Mar 13 #Python
浅析python标准库中的glob
Mar 13 #Python
Python3标准库glob文件名模式匹配的问题
Mar 13 #Python
python编写俄罗斯方块
Mar 13 #Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 #Python
You might like
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
Python for循环生成列表的实例
2018/06/15 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
门卫工作岗位职责
2013/12/17 职场文书
趣味运动会广播稿
2014/09/13 职场文书
解除劳动合同协议书
2014/09/17 职场文书
2015年教师节活动总结
2015/03/20 职场文书
第二次离婚起诉书
2015/05/18 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Flask response响应的具体使用
2021/07/15 Python
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js