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中的is和id用法分析
Jan 26 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python单例模式的多种实现方法
Jul 26 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
Python字典实现伪切片功能
Oct 28 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
Python 流媒体播放器的实现(基于VLC)
Apr 28 Python
Python机器学习之底层实现KNN
Jun 20 Python
python神经网络学习 使用Keras进行简单分类
May 04 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
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
JavaScript库 开发规则
2009/01/31 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
python实现自动重启本程序的方法
2015/07/09 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
python安装sklearn模块的方法详解
2020/11/28 Python
制药工程专业个人求职自荐信
2014/01/25 职场文书
元旦获奖感言
2014/03/08 职场文书
支部组织生活会方案
2014/06/10 职场文书
公司合作意向书范文
2014/07/30 职场文书
通知范文怎么写
2015/04/16 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
解析Redis Cluster原理
2021/06/21 Redis
python实现简单的聊天小程序
2021/07/07 Python
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python