Thứ Tư, 26 tháng 2, 2014

Django tut

Install Django
1. Install Git
   $ sudo apt-get install git
2. $ git clone git://github.com/django/django.git django-trunk
   $sudo pip install -e django-trunk/
Thế là đã cài xong Django
Dể kiểm tra chắc chắn Django đã được cài chưa và ở phiên bản nào:
  $ python -c "import django; print(django.get_version())"

Tạo Project mới
Chuyển đến thư mục: /django-trunk/django/bin/ ,là thư mục có chứa file django-admin.py và chạy command line:
$ django-admin.py startproject mysite

"mysite' là tên project mới tạo ra, có thể thay đổi tên project tuy ý
Bước trên có tác dụng: Tạo ra một instace của Django, bao gồm database configuration, Django-specific oftions và application-specific settings

writing a database Web app in Django
Bước đầu tiên là  có bản chất là định nghĩa models, database layout và thêm metadata. Nghĩa là tạo tạo database với models theo app của chúng ta
Một số thuật ngữ:
+ metadata: thông tin mô tả tài nguyên thông tin
+ A database layout: mô hình database (???)

Trong polls app, ta tạo hai models là Question và Choice.Mỗi Choice được liên kết với một Question

# polls/models.py

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)


trong ví dụ trên:
+ Mỗi model được biểu diễn bởi một class, là subclasses của django.db.models.Model
=> Django đã xây dựng sẵn các model, mỗi model có một sô subclass có sẵn, mỗi class này biểu diễn một phần của database trong model=> ko phải xây dựng lại db từ đầu mà chỉ cần subclass django model rồi viết thêm thuộc tính vào cho phù hợp với yêu cầu

+ mỗi 'field' được đại biểu diễn bởi một instance của một Field class:
 - CharField biểu diễn character field
 - DateTimeField biểu diễn cho datetimes field
Những instance này báo cho Django biết lạo data lưu trữ trong field tương ứng trong database
+ question_textpub_date... là tên của các field đó
+ ForeignKey: mỗi Choice sẽ được liên kết với một Question riêng

Activating models( kích hoạt các models )
 Code model đó đưa lại cho Django khá nhiều thông tin. VỚi nó, Django có thể:
+ Taọ nên một database schema( CREATE TABLE statements) cho app này
+ Tạo nên một Python database-access API cho quá trình truy cập Choice và Question obj

1. Khai báo cho project là polls app đã được thiết lập
Sửa file mysite/setting.py, thêm vào mục INSTALL_APPS tên models chúng ta vừa lập là 'polls'
sau đó chạy lệnh:
$ python manage.py makemigrations polls

makemigrations:( make-migration) báo cho Django biết có một vài sự thay đổi tới các models, trong trường hợp này là chúng ta thêm một và bạn muốn thấy sự chuyển đổi đó được lưu trữ như là một migration
Migrations: là caí cách mà Django lưu trữ những sự thay đổi các models. Và chúng ta có thể đọc được trong 'pool/migrations/0001_initial.py'

 Có một câu lệnh sẽ chạy migrations cho bạn  và quản lý database schema một cách tự động:
$ python manage.py sqlmigrate polls 0001

Một số câu lệnh để ' chơi với API":
-Question.objects.all(): show tất cả các obj trong Question field
-q = Question(các thông số của Question): tạo một object mới đặt tên là q
-q.id => show số id của q. Số này do Django tự tạo theo thứ tự các obj tăng dần
-q.question_text : show thông số 'question_text' của q
-q.question_text = "What's up?": thay đổi thông số của q
-Question.objects.filter(id=1): shown obj có id =1
-Question.objects.get(id=2): tương tự filter
-q.choice_set.all(): show tất cả các choice_set của q
-q.choice_set.create(choice_text='Not much', votes=0): tạo nên choice_set mới cho q
-c.delete(): delete obj c

...................

Phát triển server :
Chạy server:
~/django-trunk/django/bin/mysite$ python manage.py runserver 0.0.0.0:8000
Chúng ta nhìn thấy hai bảng nội dung: Groups và Uers. Chúng được cung cấp bởi flamework "django.contrib.auth"
+ Đưa polls app của chung ta lên server:
Chúng ta khai báo với django rằng Question object có một interface, dùng để thêm, tạo sửa... Question ...:
Sửa file /polls/admin.py như sau:

from django.contrib import admin
from polls.models import Question
 #khai báo với admin object Question và tạo cho Question một interface riêng( add thêm #bao nhiêu là tùy ý, nhưng bạn phải định nghĩa obj đó trong 'models.py'
admin.site.register(Question)


Bạn có thể tay đổi vị trí của các field trong Question obj:

from django.contrib import admin
from polls.models import Question

class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)


Bạn cũng có thể thêm các thông tin vào các field với từ khóa 'field':


#polls/admin.py

from django.contrib import admin
from polls.models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Question, QuestionAdmin)


Bạn cũng có thể thiết lập một fieldset được ẩn đi lúc ban đầu với 'collapse' . Cách này có ích khi một thông tin của obj nào đó quá dài hoặc bạn không muốn nó hiện ra trực tiếp trên interface

#polls/admin.py

from django.contrib import admin
from polls.models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]


Add các obj liên quan:
Ví dụ trong trường hợp này là Question liên quan đến Choice, và một Question có thể chứa nhiều Choice nhưng admin page lại không hiển thị Choice. Có hai cách để giải quyết vấn đề này:
+ đang kí Choice với admin page tương tự với Question obj
+ Cách 2 đưa cho bạn cạc giải quyết hay hơn:
#polls/admin.py

from django.contrib import admin
from polls.models import Choice, Question


class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'],
                              'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)


Như thế này sẽ đưa ra các options cho Choice theo hàng dọc

Nếu ta thay ' StackedInline' bẳng 'TabularInline' thì giao diện của Choice có các options hiển thị theo hàng ngang( đẹp hơn :v)

Điều chỉnh giao diện của Question obj:
Với list_display = (các methods của Question ) sẽ hiển thị các thuộc tính của Quesion theo hàng ngang
 vd: list_display = ('question_text', 'pub_date', 'was_published_recently')
Với list_filter = ['methods của Question'] sẽ thêm các lựa chon cho thuộc tính đó hiển thị phía bên tay phải giao diện của Question. Nhưng bận sẽ phải thêm một số thuộc tính cuả method trong file /models.py
vd: list_filter = ['pub_date'] sẽ lựa chon các option như theo ngày , tháng tuần. trong file /models.py thêm :

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'


Với search_fields = ['question_text'] bạn sẽ thêm tính năng search cho method 'question_text'

1 nhận xét:

  1. nếu có mục nào nói về virtualenv thì hãy đọc mục đấy trước
    không thì xem tut bên flask
    không ai cài django mà phải dùng sudo cả.

    Trả lờiXóa