实用技巧(掉进去又爬出来的坑儿)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用技巧(掉进去又爬出来的坑儿)相关的知识,希望对你有一定的参考价值。
1.将字符型的字段转化为整形进行排序
1 # Django实现将字符型的字段转化为整形进行排序 2 # mysql数据库(不同的数据库会有迁移问题) 3 # Goods:模型类 4 # productnum:销量 5 # extra:一个Django的拓展查询方法,参数select是个字典 6 goods = Goods.objects.extra(select={‘p‘: ‘productnum+0‘}) 7 goods = goods.extra(order_by=["p"]) # -p则为倒序 8 9 # 相当于sql语句 10 SELECT *,productnum+0 AS p FROM goods ORDER BY p |
2.ajax的post请求(py3.5+dj1.11)
- 数据以什么格式提交,及怎么获取request中的数据
- js文件
1 $.ajax({ 2 type: "POST", 3 url: "/accountAjax/", // 此处一定要两侧都加/ 4 dataType: "json", 5 data: JSON.stringify({"account_str": account_str}), //这里是坑:以json的形式提交 6 success: function(data){ 7 if(data.infos == "error"){ 8 occupied_err.style.display = "block"; 9 } 10 } 11 }) |
- views文件
1 def accountAjax(request): 2 if request.method == "POST": 3 # 这里同样要以json的形式接受 4 # decode():将数据从二进制解码为json字符串 5 # json.loads():将数据还原为字典,再取其中的值就可以了 6 account = json.loads(request.body.decode())["account_str"] 7 try: 8 User.objects.get(userAccount=account) 9 return JsonResponse({"infos": "error"}) 10 except User.DoesNotExist: 11 return JsonResponse({"infos": ""}) |
- csrf问题
如果Django开启了csrf中间件,ajax的请求就会出问题,我们可以再js中应用Django官网提供的ajaxsend,之间将代码放在顶部就可以了
jQuery(document).ajaxSend(function(event, xhr, settings) { 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 sameOrigin(url) { // url could be relative or scheme relative or absolute var host = document.location.host; // host + port var protocol = document.location.protocol; var sr_origin = ‘//‘ + host; var origin = protocol + sr_origin; // Allow absolute or scheme relative URLs to same origin return (url == origin || url.slice(0, origin.length + 1) == origin + ‘/‘) || (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + ‘/‘) || // or any other URL that isn‘t scheme relative or absolute i.e relative. !(/^(\/\/|http:|https:).*/.test(url)); } function safeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }
if (!safeMethod(settings.type) && sameOrigin(settings.url)) { xhr.setRequestHeader("X-CSRFToken", getCookie(‘csrftoken‘)); } }); |
3.Django显示图片相关配置
- 首先,目录结构应该是:项目根目录下的media/avatar来存放图片
- 其次,模型类的字段设置:avatar = ImageField(upload_to=‘avatar/‘)
- 还有,数据库中存放结果一定得是:avatar/xxxx.jpg
- settings文件
# 这两个是静态文件路径,其实显示不显示图片这两个你都要设置 STATIC_URL = ‘/static/‘ STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static‘)]
# 而这两个是显示媒体文件必须要设置的,原理和静态文件是一样的 MEDIA_URL = ‘/media/‘ MEDIA_ROOT = os.path.join(BASE_DIR, ‘media‘) |
- urls文件(注意是项目文件下的)
# 在文件中增加下面的代码 from django.conf import settings from django.views.static import serve # 相当于处理媒体文件的一个函数 urlpatterns = [ ...... url(r‘^media/(.*)‘, serve, {"document_root": settings.MEDIA_ROOT}), ] |
- template文件
<!-- 模板中一定要给出相对路径:/media/avatar/xxxx.jpg --> <!-- 也可以是{{ user.avatar.url }} 也就是:表名.字段名.url --> <span><img src="/media/{{ userImg }}"></span> |
以上就是全部注意点,最好完全一样
4.给模型类对象自定义属性
# user是从数据库中取出的一条数据对象 # new_add_attr是User模型类中没有定义的属性, # 可以通过这种方式给user设定一个新属性,用于后续的局部操作,但数据库中并没变 user = User.objects.get(username=username) user.new_add_attr = 10 |
5.借用Django用户系统注意点
1.存用户:create_user()
# 创建Django后台用户必须用create_user(),此方法可以将密码hash加密,存入后台;否则密码将明文存入数据库,注册后登陆不上。 # 也可以用create(),但存密码时调用django.contrib.auth.hashers.make_password() user = User.objects.create_user(username=username, password=password, email=email) |
6.json.dumps()序列化不了DateTime格式的字符串
# 可以通过下面的方式序列化数据,dumps()不了的数据全部可以用序列化的方式来处理 json_data = serializers.serialize(‘json‘, goods) return JsonResponse(json_data, safe=False) |
7.信号量
django的信号量: django在执行某些操作之前会向全局发送一个信号, 我们可以截获这些信号,并加入一些逻辑, 比如post_save(), 就可以在保存post的数据之前对数据进行一些操作. 比如将新注册的账号的密码加密后再保存
# signals.py from django.db.models.signals import post_save from django.dispatch import receiver from django.contrib.auth import get_user_model
UserProfile = get_user_model()
@receiver(post_save, sender=UserProfile) def create_user(sender, instance=None, created=False, **kwargs): if created: instance.set_password(instance.password) instance.save()
# __init__.py default_app_config = ‘users.apps.UsersConfig‘
# apps.py class UsersConfig(AppConfig): name = ‘users‘
def ready(self): import users.signals |
以上是关于实用技巧(掉进去又爬出来的坑儿)的主要内容,如果未能解决你的问题,请参考以下文章