原文地址:http://agiliq.com/books/djenofdjango/chapter3.html(英文)
BUILDING A PASTEBIN(创建pastebin小项目)
djang里的url.py在我们的项目里使用来控制进入站点的流向,所有进入的urls将会与urlpatterns里配置的正则表达式匹配。
开始:设计app (Designing a pastebin app)
- Allow users to paste some text (允许用户复制)
- Allow users to edit or delete the text (允许用户编辑和删除)
- Allow users to view all texts (允许用户查看所有的文本信息)
- Clean up texts older than a day (清除掉超过一天的文本内容)
Some ‘views’ that the user will see are(html展示)
- A list view of all recent texts (列出最近的文本)
- A detail view of any selected text (每个文本的详细信息)
- An entry/edit form for a text (编辑文本界面)
- A view to delete a text (删除界面)
我们将会用到的generic View
django.views.generic.DetailView
(用来显示每个文本的详细信息)
django.views.generic.ListView
(用来显示文本的列表,全部文本)
django.views.generic.DeleteView
(删除)
django.views.generic.UpdateView
(更改、编辑)
创建一个应用
django-admin manage.py startproject pastebin
(创建项目 )
django-admin manage.py startapp app02
(创建 app02 应用)In pastebin/models.pyfrom django.db import models# Create your models here.class Paste(models.Model): text = models.TextField() name = models.CharField(max_length=40, null=True, blank=True) created_on = models.DateTimeField(auto_now_add=True) updated_on = models.DateTimeField(auto_now=True) def __unicode__(self): return self.name or str(self.id) auto_now_add 把当前时间给 created_on字段,并且每次提交后不可更改。 auto_now 与 auto_now_add 类似,但是每次更改完文本再次提交后会改变,显示当前提交的时间。 id 是默认创建的主键 Adding our app to the projectINSTALLED_APPS = ('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',#'app01','app02',)数据库的配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}
同步数据库
django-admin manage.py makemigrationsdjango-admin manage.py mirgate
配置app02/urls.py pastebin/urls.py
1、/pastebin/urls.py
from django.conf.urls import patterns, include, urlfrom django.contrib import adminurlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), (r'^pastebin/', include('app02.urls')),)2、app/urls.py
'''@author: xaiowei'''from django.views.generic.list import ListViewfrom django.conf.urls import *from app02.models import Pastefrom django.conf.urls.i18n import urlpatternsfrom sre_parse import Patternfrom django.views.generic import DetailViewfrom django.views.generic.edit import CreateViewfrom django.conf.urls import patternsfrom gc import get_objectsfrom app02.views import MyDetailView,MyListView,show,MyDeleteView,MyUpdateViewurlpatterns = patterns ('',url(r'^paste/(?P\d+)/$',MyDetailView.as_view(),name='pastebin_paste_detail'),url(r'^pastes/$', MyListView.as_view(),name='pastebin_paste_list'),url(r'^index/$', 'app02.views.show'),url(r'^paste/delete/(?P \d+)$',MyDeleteView.as_view() , name='pastebin_paste_delete'), DetailView读取的是pk或者slugurl (r'^paste/edit/(?P \d+)$', MyUpdateView.as_view(), name='pastebin_paste_edit'), UpdateView读取的也是pk或者slugurl(r'^$',CreateView.as_view(model=Paste)), ) 配置模板 app02/templates/app02/paste_form.html View All首页 Create new Paste
app02/templates/app02/paste_detail.htmlView Alldetail { % if messages %} { % endif %}Paste Details:
{ { object.id }}{ { object.name }}{ { object.created_on }}{ { object.updated_on }}Actions
app02/templates/app02/paste_list.html<h1>list</h1> { % if show %}Recent Pastes:
{ % for paste in show %}
{ % else %}- { { paste }}
{ % endfor %}No recent pastes
{ % endif %}app02/templates/app02/paste_confirm_delete.htmlInsert title here Really delete paste { { object }}?
This action cannot be undone
app02/views.py
from django.shortcuts import render# Create your views here.from django.views import genericfrom app02.models import Pastefrom django.core.urlresolvers import reverse_lazyclass MyDetailView(generic.DetailView): model = Paste template_name='app02/paste_detail.html'class MyListView(generic.ListView): context_object_name='show' template_name='app02/paste_list.html' def get_queryset(self): """Return the last five published questions.""" return Paste.objects.all()class MyDeleteView(generic.DeleteView): model = Paste success_url = reverse_lazy('pastebin_paste_list')class MyUpdateView(generic.UpdateView): model = Paste def show(request): a = Paste.objects.all() return render(request,'app02/index.html',{ 'a':a})