1. 程式人生 > >實用技巧(掉進去又爬出來的坑兒)

實用技巧(掉進去又爬出來的坑兒)

not protoc obj json splay 不顯示圖片 sub 我們 bject

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

實用技巧(掉進去又爬出來的坑兒)