Django学習(二)——個人ブログサイトの実現
8311 ワード
Django Webサイトクイックスタート
2.1個人ブログサイト計画
個人ブログには次の機能があります.
プロジェクトを作成するには
django-admin startproject mblog
cd mblog
python mange.py startapp mainsite
setting.pyに
'mainsite'
を加える2、ブログデータシートの作成
python manage.py migrate
Djangoデータベースを使用するには、次の手順に従います.
python manage.py makemigrations mainsite
を使用してデータベースとDjango間の中間ファイルpython manage.py migrate
を使用してデータベースのコンテンツを同期更新修正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ファイル.
編集
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
でデータまたは資料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 %}
:{{now}}
受信データを出力するために{{}}を使用し、各データ項目のフィールドはpostである.body、post.titleの方式で取り出します.
HTMLタグでpostを取り出す.slugは、リンクアドレスとして作成され、post/の下に置かれます.URL対応url.py表示する単一の文章の内容に対応するために、これらのウェブサイトを識別するには、次の手順に従います.
url.py
に設定し、/post/先頭のURLであれば、後に続く文字をパラメータとしてpost_にslugを転送するdetailは、単一の文章の関数を表示します.view.py
関数をpost_detail
に追加した.post_detail
関数では、slugをキーワードとしてデータセットを検索し、一致する項目があるかどうかを探し出す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 }}