djang1.7 复制粘贴小项目(generic View的使用)
原文地址: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.py from 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, url from django.contrib import admin urlpatterns = 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 ListView from django.conf.urls import * from app02.models import Paste from django.conf.urls.i18n import urlpatterns from sre_parse import Pattern from django.views.generic import DetailView from django.views.generic.edit import CreateView from django.conf.urls import patterns from gc import get_objects from app02.views import MyDetailView,MyListView,show,MyDeleteView,MyUpdateView urlpatterns = patterns ('', url(r'^paste/(?P<pk>\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<pk>\d+)$',MyDeleteView.as_view() , name='pastebin_paste_delete'), DetailView读取的是pk或者slug url (r'^paste/edit/(?P<pk>\d+)$', MyUpdateView.as_view(), name='pastebin_paste_edit'), UpdateView读取的也是pk或者slug url(r'^$',CreateView.as_view(model=Paste)), )
配置模板
app02/templates/app02/paste_form.html<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>Create new Paste</h1> <form action="" method="POST"> {% csrf_token %} <table> {{ form.as_table }} </table> <input type="submit" name="create" value="Create"> </form> <a href='{% url 'pastebin_paste_list' %}'>View All</a> </body> </html>app02/templates/app02/paste_detail.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>detail</title> </head> {% if messages %} <div class="messages"> <ul> {% for message in messages %} <li class="{{ message.tag }}"> {{ message }} </li> {% endfor %} </ul> </div> {% endif %} <h1>Paste Details: </h1> <p> <div> <label>ID</label> <span>{{ object.id }}</span> </div> <div> <label>Name</label> <span>{{ object.name }}</span> </div> <div> <label>Text</label> <textarea rows="10" cols="50" OnClick="this.select();" readonly="true">{{ object.text }}</textarea> </div> <div> <label>Created</label> <span>{{ object.created_on }}</span> </div> <div> <label>Modified</label> <span>{{ object.updated_on }}</span> </div> </p> <h2>Actions</h2> <ul> <li> <a href="{% url 'pastebin_paste_edit' object.id %}">Edit this paste</a> </li> <li> <a href="{% url 'pastebin_paste_delete' object.id %}">Delete this paste</a> </li> </ul> <a href="{% url 'pastebin_paste_list' %}">View All</a>app02/templates/app02/paste_list.html<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title><h1>list</h1></title> </head> <body> {% if show %} <h1>Recent Pastes:</h1> <ul> {% for paste in show %} <li> <a href="{% url 'pastebin_paste_detail' paste.id %}">{{ paste }}</a> </li> {% endfor %} </ul> {% else %} <h1>No recent pastes</h1> {% endif %} </body> </html>app02/templates/app02/paste_confirm_delete.html<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Really delete paste {{ object }}?</h1> <h2>This action cannot be undone</h2> <form action="{% url pastebin_paste_delete object.id %}" method="POST"> {% csrf_token %} <input type="submit" value="Delete"> </form> </body> </html>app02/views.py
from django.shortcuts import render # Create your views here. from django.views import generic from app02.models import Paste from django.core.urlresolvers import reverse_lazy class 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})