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实现的简单猜数字游戏
Apr 04 Python
python正则表达式re之compile函数解析
Oct 25 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
Django基础CBV装饰器和中间件
Mar 22 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
JavaScript OOP面向对象介绍
2010/12/02 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
浅谈$('div a') 与$('div&gt;a')的区别
2016/07/18 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
Python下线程之间的共享和释放示例
2015/05/04 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Django中的AutoField字段使用
2020/05/18 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
Shell编程面试题
2012/05/30 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
国庆节促销广告语2014
2014/09/19 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
导游词幽默开场白
2019/06/26 职场文书
Python数据类型最全知识总结
2021/05/31 Python