實用技巧(掉進去又爬出來的坑兒)
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 |
實用技巧(掉進去又爬出來的坑兒)