实用技巧(掉进去又爬出来的坑儿)

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_attrUser模型类中没有定义的属性,

# 可以通过这种方式给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()不了的数据全部可以用序列化的方式来处理

from django.core import serializers

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

 




以上是关于实用技巧(掉进去又爬出来的坑儿)的主要内容,如果未能解决你的问题,请参考以下文章

排 bug 技巧

《韦东山新视频 — 设备树调试技巧》

赛车漂移的技巧与方法

Android开发笔记(序)写在前面的目录

移动web开发技巧

css 中的背景图片小技巧和存在的坑