Django学習(二)——個人ブログサイトの実現

8311 ワード

Django Webサイトクイックスタート


2.1個人ブログサイト計画


個人ブログには次の機能があります.
  • プロジェクト名mblog
  • admin管理インタフェースによる投稿、編集および削除投稿
  • Bookstrap Webフレームワーク
  • を使用
  • 各記事のタイトルと投稿日
  • をホームページに表示
    プロジェクトを作成するには
        django-admin startproject mblog
        cd mblog
        python mange.py startapp mainsite
    

    setting.pyに'mainsite'を加える

    2、ブログデータシートの作成

    python manage.py migrate
    

    Djangoデータベースを使用するには、次の手順に従います.
  • はmodels.pyで使用するクラスを定義する(models.Modelsから継承)
  • は、クラス内の各変数、すなわち、データテーブル内の各フィールド
  • を詳細に設定する.
  • python manage.py makemigrations mainsiteを使用してデータベースとDjango間の中間ファイル
  • を作成する.
  • python manage.py migrateを使用してデータベースのコンテンツを同期更新
  • .
  • プログラムでpythonを使用する操作方法で定義されたデータクラスは、操作データベースのデータテーブル
  • に等しい.
    修正pyコンテンツ
    from django.db import models
    from django.utils import timezone
    # Create your models here.
    
    class Post(models.Model):
        title = models.CharField(max_length=200)
        slug = models.CharField(max_length=200)
        body = models.TextField()
        pub_date = models.DateTimeField(default=timezone.now)
    
        class Meta:
            ordering = ('-pub_date',)
    
        def __unicode__(self):
            return self.title
    

    注意:postクラスを作成します(データベースに対応するデータテーブルがあります).このような項目にはいくつかの項目が含まれています.title-テーマです.slug-Webサイト;body-コンテンツ;pub-date-発表の時間.Class Meta内の設定は、文章の表示順序がpub_であることを指定します.dateに基づいて.unicodeはこのような生成されたデータ型を提供し、文章のタイトルを表示する内容として、操作中の可読性を高め、strではなくunicodeを使用して、タイトルに中国語をサポートさせる.
    pub_dateにはpytzモジュールが必要で、pip install pytzのインストールを実行します.
    このモデルを有効にして、次のようにします.
    python manage.py makemigrations
    

    管理者アカウントとパスワードの作成:
    python manage.py createsuperuser
    

    前に定義したpostを管理に組み入れます:mainsite/admin.pyを修正して、しかも日付と時間などの内容を貼り付けます:
    from django.contrib import admin
    from .models import Post
    # Register your models here.
    
    class PostAdmin(admin.ModelAdmin):
        list_display = ('title','slug','pub_date')
    
    admin.site.register(Post,PostAdmin)
    
    *.*.*.*:8000\adminアクセスを使用して、少なくとも5つの文章を作成し、後続のテストを容易にします.
    DjangoのMTVアーキテクチャ(クラス比MVC)について簡単に説明します.Djangoはデータのアクセスと表示をModel,Template,Viewに分けている.それぞれmodelsに対応する.py、templateフォルダ、view.pyファイル.
  • Model——model.py:主にアクセスするデータ型を定義し、Pythonのclassクラスで定義します.バックエンドDjangoでは、どのデータベースを使用しているかにかかわらず、このクラスの設定を自動的にデータベースシステムに対応します.
  • View——view.py:これらのデータをどのように保存したり取り出したりするかなどのプログラムロジックを担当します.
  • Template-templateフォルダ:取得したデータを美しく弾力性のある方法で出力します.

  • 編集mainsite/admin.py
    from django.contrib import admin
    from .models import Post
    # Register your models here.
    
    class PostAdmin(admin.ModelAdmin):
    list_display = ('title','slug','pub_date')
    
    admin.site.register(Post,PostAdmin)
    

    root@django:~/mblog# vim mainsite/views.py
    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import Post
    
    # Create your views here.   
    def homepage(request):
        posts = Post.objects.all()
        post_lists = list()
        for count, post in enumerate(posts):
            post_lists.append(No.{}".format(str(count))+str(post)+"
    ") post_lists.append(""+str(post.body.encode('utf-8'))\+"

    ") return HttpResponse(post_lists)

    まずモデルをpyでカスタムModelをインポートし、Postを使用します.objects.all()はすべてのデータ項目を取得し、forループですべての内容を取り出し、HttpResponseでWebページに出力します.
    この例では、homepage関数を作成してすべての文章を取得し、ループして変数post_を収集します.listsでは、最後に`return HttpResponse(post_lists)を使用して、この変数の内容をユーザー側のブラウザページに出力します.
    この関数は、urls.pyによって呼び出される.url.pyは、ウェブサイトとプログラム間の対応を担当します.urls.pyを開き、views.pyからのhomepage関数をurlでインポートします.
    from django.conf.urls import include, url
    from django.contrib import admin
    from mainsite.views import homepage, showpost
    
    urlpatterns = [
        url(r'^$', homepage),
        url(r'^admin/', include(admin.site.urls)),
    ]
    

    プログラムを書く時、表示の様子とどのようにデータあるいは資料の内容を保存するかを分けてやっと比較的にメンテナンスしやすくて、そのため、正しい方法はviews.pyの中でデータあるいは資料を準備して、それからtemplateの中に置いて、templateの中の.htmlのファイルに本当の表示の仕事を担当させます.

    2.3ウェブサイトがページ出力に対応


    前に手に入れたデータをより美しくするにはどうすればいいですか?答えはテンプレートtemplateです.出力された各ページには、.htmlのファイル形式で指定されたフォルダに格納された1つ以上の対応するテンプレートが用意され、ウェブサイトにデータが出力される必要がある場合は、レンダリング関数(render)によってテンプレート指定された位置にデータが格納され、結果が得られたらHttpResponseに渡してブラウザに出力される.基本手順は次のとおりです.
  • テンプレートフォルダの位置setting.pyを設定
  • .
  • url.pyにおけるウェブサイトとview.pyにおける関数との対応関係
  • を作成する.
  • .htmlファイル(index.htmlなど)を作成し、レイアウトを作成し、データを防止する場所
  • を配置します.
  • はプログラムを実行し、objects.all()views.htmlでデータまたは資料
  • を取得する.
  • は、render関数で指定するテンプレートファイル(例えばindex.html)の
  • にデータ(例えばposts)を送る.
    templatesフォルダを作成し、settingsにフォルダ名を追加します.pyのTEMPLTEブロック(DIRSの行を変更するだけ):
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    

    次にpostとnowをテンプレート(例index.html)に表示し、views.pyを以下のように変更します.
    from django.template.loader import get_template
    from django.http import HttpResponse
    from datetime import datetime
    from .models import Post
    # Create your views here.
    
    def homepage(request):
        template = get_template('index.html')
        posts = Post.objects.all()
        now = datetime.now()
        html = template.render(locals())
        return HttpResponse(html)
    

    ここでは、local()関数を使用して変数をテンプレートに配置する小さなテクニックを使用します.この関数は、現在のメモリ内のすべてのローカル変数を辞書タイプでパッケージ化します.テンプレートではすべてのローカル変数が受信されるため、postsとnowをすべて使用することもできます.templatesディレクトリの下に、index.htmlというテンプレートファイルを作成します.
    
    
    
        
        
             
        
    
    
        

    のブログへようこそ


    {% for post in posts %}

    {{ post.title }}


    :{{now}}


    受信データを出力するために{{}}を使用し、各データ項目のフィールドはpostである.body、post.titleの方式で取り出します. HTMLタグでpostを取り出す.slugは、リンクアドレスとして作成され、post/の下に置かれます.
    URL対応url.py表示する単一の文章の内容に対応するために、これらのウェブサイトを識別するには、次の手順に従います.
  • url.pyに設定し、/post/先頭のURLであれば、後に続く文字をパラメータとしてpost_にslugを転送するdetailは、単一の文章の関数を表示します.
  • は、requestパラメータに加えてslugパラメータ
  • も受け入れるview.py関数をpost_detailに追加した.
  • templatesフォルダに単一の文章を表示するためのpostを作成する.html
  • post_detail関数では、slugをキーワードとしてデータセットを検索し、一致する項目があるかどうかを探し出す
  • .
  • がある場合は、見つかったデータ項目をrender関数に転送し、post.htmlテンプレートページを見つけてレンダリング(すなわちページ表示)し、結果をHttpResponseに渡してブラウザ
  • に返信する.
  • 該当する項目がなければ、ホームページをトップページ
  • に返信する.mblog/urls.pyは以下の修正を行います.
    from django.conf.urls import include, url
    from django.contrib import admin
    from mainsite.views import homepage, showpost
    
    urlpatterns = [
        url(r'^$', homepage),
        url(r'^post/(\w+)$', showpost),
        url(r'^admin/', include(admin.site.urls)),
    ]
    

    すべての/postの先頭のURLを探し出して、2番目のパラメータ(1番目はデフォルトのrequest)としてshowpost関数に渡します.
    同時にviewsでpyでこの関数を新規作成して、受信したパラメータを処理します.内容は次のとおりです.
    from django.template.loader import get_template
    from django.http import HttpResponse
    from datetime import datetime
    from .models import Post
    from django.shortcuts import redirect
    # Create your views here.
    ... 
    
    def showpost(request, slug):
        template = get_template('post.html')
        try:
        post = Post.objects.get(slug=slug)
        if post != None:
            html = template.render(locals())
            return HttpResponse(html) 
        except:
        return redirect('/')
    

    インシデント処理を加え、インシデントが発生した場合はredirect('/')でトップページに直接戻ります.
    記事を表示するpost.htmlの内容は次のとおりです.
    
    
    
        
        
             
        
    
    
        

    {{ post.title }}


    {{ post.body }}