顯示具有 Django 標籤的文章。 顯示所有文章
顯示具有 Django 標籤的文章。 顯示所有文章

Django View 小筆記

沒有留言:

這個做法是把loading放在template,弱化了url, view的code.
算是把重心放到前端上的技巧。

在此使用的Model如下
Model
class TestObj(models.Model):
    name = models.CharField(max_length=10)
    create_datetime = models.DateTimeField()

    def __str__(self):
        return "%s, %s" % (self.name, self.create_datetime.date())


Url
url有一個變數稱為pk, pk是primay key的縮寫, 在此要填的是主key的值。
from django.conf.urls import url
from . import views


urlpatterns = [
 #...
    #test View
    url(r'^test/(?P[0-9]+)/$', views.TestObjView.as_view(), name='test'),
]

View

view有兩種,一個是取model物件的DetailView,一個是取QuerySet的ListView

ListView
template_name 預設值為<app name>/<template name>_list.html
# -*- coding: utf-8 -*-
from . import models
from django.views import generic

class TestObjView(generic.ListView):
    model = models.TestObj
 #template_name = 'testobj.html' #可自行手動指定

DetailView
template_name 預設值為<app name>/<template name>_detail.html
另一個是ListView, 顯示QuerySet的結果。
預設Query完的變數名稱: <model name>_list
# -*- coding: utf-8 -*-
class TestObjView(generic.ListView):
    model = models.TestObj
 #template_name = 'testobj.html' #可自行手動指定

TEMPLATE
依你設定的View來決定template的命名。

必須要先接list裡的物件出來
在此示範使用預設檔名 testobj_list.html
{% for testobj in testobj_list %}
 {{testobj.name}}
{% empty %}
無資訊
{% endfor %}

直接取屬性出來顯示
在此示範使用預設檔名 testobj_detail.html
{{testobj.name}}

postman的get, post最簡單的發送

沒有留言:
沒想到,我的網誌也開了一個Web Develop的標籤了。

最近在研究後端的技術如何使用,但是因為完全不了解前端與後端溝通的方式。所以,目前是使用測試工具進行後端code的驗證。(這個也可以避免bug 前後端互推的好工具)

進入正題


因為,想學的其實是rest的api如何設計,如何使用Django實現,所以使用postman測試時,也是使用rest的格式進行測試。

因為在此,只是為了要講postman的最簡使用方法。
所以讓Django做最簡化的coding就好。

這次功能示範用的專案目錄架構
┌mysite
│├mysite
││├setting.py
││├url.py
││├view.py
 ...
settings.py 要先註解掉CsrfViewMiddleware
注意:這只是為了測試或練習,正式架站完全不會這麼做!
MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
urls.py
呼叫測試程式
urlpatterns = [
    url(r'^test_function/$', test),
]
views.py
寫入判斷與回傳給瀏覽器的字串。
# -*- coding: utf-8 -*-
from django.http import HttpResponse

...
def test(request):
    if 'ok' in request.GET:
        return HttpResponse('this is get')
        
    if 'ok' in request.POST:
        return HttpResponse('this is post')
        
    return HttpResponse('nothing');

GET

在網址列的後面有個Params,按下去,輸入參數,該參數會出現在網址列後面。
在Django的views.py中,如果有值,可以用request.GET['ok']取值。(此例沒有值)

POST

在網址列下面有一個Body,底下選from-data。
一樣有一個key-value的地方可以填值,將post要傳的值填上去,這些值並不會出現在網址列。
在Django的views.py中,如果有值,可以用request.POST['ok']取值。(此例沒有值)

Django之Model的CRUD操作

沒有留言:

Query

return QuerySet

<model name>.objects.all()

多重條件 邏輯and


  • 取得符合條件的物件
    <model name>.objects.get(<model attribute name>=<attribute value>, ...)
  • 取得符合條件的QuerySet
    <model name>.objects.filter(<model attribute name>=<attribute value>, ...)

slicing QuerySet

<QuerySet obj>[index_start]
<QuerySet obj>[index_start:index_end]

不支援反向索引

<QuerySet obj>[-index_start]

order by

<model name>.objects.order_by('<model attribute name>')
<model name>.objects.order_by('-<model attribute name>')

模糊查詢

<model attribute name> + <'__contains'>=<attribute value>

關係管理器

主模型.關聯模型的小寫名稱_set

CRUD

Create

<QuerySet obj> = <model name>(<model attribute name>=<attribute value>, ...)
<QuerySet obj>.save()

<QuerySet obj> = <model name>.objects.create(<model attribute name>=<attribute value>, ...)

Read

就是Query

Update

<model name>.objects.filter(<model attribute name>=<attribute value>, ...).update(<model attribute name>=<attribute value>)

Delete

<QuerySet obj>.delete()

參考資料
[1] Django筆記(5) - 模型與資料庫

Django模型: 注意事項(>1.7版)

沒有留言:

1. 建立模型[1]

用python寫好django model的class

2. 檢查資料[1]

$python manage.py check (1.7版之後限定)
看到0 errors found的通知

3. 翻譯成資料庫語言[1]

$python manage.py sqlmigrate <app name>

建立migration資料檔
建立好資料庫模型後,我們必須針對目前的模型先建立一個migration檔

建立異動紀錄[1]

$ python manage.py makemigrations <app name>
如果模型有任何異動,則會產生新的migration檔,並放置在APP底下的migration資料夾
$ python manage.py makemigrations
Django會對所有安裝好的APP做migration的檢查

4. 模型與資料庫之同步[2]

$ python manage.py syncdb

>1.7版(無須第4步)

以>1.7版的角度來複習一下剛剛的重點

參考自1.9版的官網文件
$ python manage.py makemigrations <app name>
告訴Djagno確認Model與上一版的異動
$ python manage.py sqlmigrate <app name> <vertion number>
依目前已確認的模型,生成SQL(非必要執行)
$ python manage.py migrate
把模型變成真的Table

參考資料

[1] Django筆記(5) - 模型與資料庫
[2] What should I use instead of syncdb in Django 1.9?

Django//1.7版教學+1.8版的程式遇到的困難之一

沒有留言:
頭一個遇到的困難,就是靜態網頁放置的放置找不到。
在這篇的教學中,是教我們這麼做
# mysite/settings.py

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates').replace('\\', '/'),
)
但是如果真的這樣寫的話,就會在Browser上發生,找不到Template的問題。
出錯的檔案會提示在Exception Location上。如果它不是你寫的code,那就看看Exception Value。

上網找一下問題之後,找到另一篇是這麼寫的。
# mysite/settings.py
#找到這一段
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'), #加入這一行
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
因為Django的1.7版和1.8版的差異,所以1.8版會找到TEMPLATES 並且要在DIR中加入路徑。
1.7的話就要自己新增TEMPLATE_DIRS。

我想就是要讓使用上更好上手吧?畢竟1.8的設計有提示你可以加入TEMPLATES的DIR,而1.7的,卻是要靠教學,無中生有的keyin出一段設定出來。

不過為了避免跟著這一篇教學一直卡關,我已經把1.8的Django改成1.7了!先學會再說呀!><

python WebService//在Ubuntu安裝Django

沒有留言:
開開心心的Google了一本教學來看,結果不是很順利,研究了一下才知道....

在Ubuntu安裝Django,有幾件事要注意
  1. 安裝python3,不可以刪掉python2
  2. 建利虛擬環境的 python3 -m venv VENV 不會順利Work

跟著國外的教學,順利唷!
它補足了上一篇缺的問題解決。
順利的把python的模擬環境功能(我也不知道是什麼)更新得可以work了。
  1. sudo apt-get update  #更新Ubuntu的更新內容
  2. sudo apt-get install python3-pip #更新python package manager(python3版)
  3. sudo pip3 install django  #從pip更新django(python3版)
  4. django-admin --version  #查看目前django的版本(也可以看是不是有順利裝好)