准备工作
service mysqld start
create database web11 default charset utf8;
django-admin.py startproject web11
django-admin.py startapp news
templates创建
admin.py创建
settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'web09',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'news',
'django.contrib.admin',
)
models,两个数据库表,
[分类][Category](news_category)表(导航栏)
[新闻][New](news_new)表(标题和内容)
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class New(models.Model):
title = models.CharField(max_length = 60)
content = models.TextField()
category = models.ForeignKey(Category)
def __unicode__(self):
return self.title
urls
from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^index/$','news.views.index'), #首页,index,映射index方法里的东西
url(r'^disp/(\d{1,5})/$','news.views.disp'), #某类,disp/id/,映射disp方法里的东西
url(r'^disp_new/(\d{1,5})/(\d{1,5})/$','news.views.disp_new'), #新闻,disp_new/category_id/new_id/,映射disp_new方法里的东西
)
views,三个方法,映射三个不同类的地址。
index:首页默认显示
disp:点击导航栏不同标签的页面
disp_new:点击新闻标题后的页面
教训:模板需要你多少东西,你就得渲染多少东西回去给他!否则会不显示。
from news.models import Category,New #导入models里的两个数据表:Category,New
from django.shortcuts import render_to_response
def index(req):
categorys = Category.objects.all() #得到所有的导航分类[nav]
news = New.objects.filter(category=categorys[0]) #从New(新闻)表中,筛选符合[New表category字段 = Category表第1项]这条件的,显示[right,left]
return render_to_response('index.html',{'categorys':categorys,'news':news}) #渲染上面两行得到的东西[导航,新闻]
def disp(req,category_id): #从urls里传过来的参数id,叫什么都可以
categorys = Category.objects.all() #得到所有的导航分类[nav]
category=Category.objects.get(id=category_id) #从所有分类里得到id符合参数id的分类,下一行要用
news = New.objects.filter(category=category) #从新闻表里筛选符合[New表的category字段 = 上一行得到的东西()[left]
return render_to_response('index.html',{'categorys':categorys,'news':news,'category':category})#渲染:模板需要多少,就渲染多少!!!
def disp_new(req,category_id,new_id): #从urls里传过来的参数category_id,new_id,叫什么都可以
categorys = Category.objects.all() #得到所有的导航分类[nav]
category=Category.objects.get(id=category_id) #从分类表里得到id符合参数category_id的分类,下一行要用
news = New.objects.filter(category=category) #从新闻表里筛选符合[New表的category字段 = 上一行得到的东西]这个条件的,显示[left]
new = New.objects.get(id = new_id) #从新闻表里得到id符合参数new_id的新闻,并显示[right]
return render_to_response('index.html',{'categorys':categorys,'news':news,'new':new})#渲染
base模板
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
<style>
#main{width: 80%;border:1px solid black;margin: 1px auto;}
#nav{height: 20px;border:1px solid blue;background-color: yellow;}
#bread{height: 20px}
#left{width: 30%;float: left;border:1px solid blue;}
#right{width: 65%;float: right;border:1px solid green;}
#nav li{display: inline-block;width: 80px}
#right .title{color: red;}
</style>
</head>
<body>
<div id="main">
<div id="nav">{%block nav%}{%endblock%}</div> <!-- 导航栏块 -->
<div id="bread">{%block bread%}{%endblock%}</div> <!-- 面包屑块 -->
<div id="left">{%block left%}{%endblock%}</div> <!-- 标题块 -->
<div id="right">{%block right%}{%endblock%}</div> <!-- 内容块 -->
</div>
</body>
</html>
index页面,继承base
{%extends 'base.html'%}
{%block nav%}
{% for c in categorys %} <!-- (index方法里)从分类表里遍历出每个分类,然后操作 -->
<li><a href='/disp/{{c.id}}'>{{c.name}}</a></li> <!-- 点击了 c.name ,就跳到 此name对应的c.id 映射的网址,而且这个id作为参数传入views.disp 。跳到disp页面以后,就调用(view.disp方法)-->
{%endfor%}
{%endblock%}
{%block left%}
{%for n in news%} <!--(index方法里)被筛选出的news,再遍历之,然后操作-->
<li><a href='/disp_new/{{n.category_id}}/{{n.id}}/' >{{n.title}}</a>></li> <!--点击了 n.title,就跳到此title对应的n.id 映射的网址 -->
{%endfor%}
{%endblock%}
{%block bread%}
<a href="/index" >首页</a>
>>
<a href='/disp/{{caregory.id}}/' >{{category.name}}</a> <!--记得要在views里渲染哦-->
>>
<a href='/disp_new/{{new.category_id}}/{{new.id}}/' >{{new.title}}</a> <!--记得要在views里渲染哦-->
{%endblock%}
{%block right%}
<div class="title">{{new.title|default:news.0.title}}</div> <!-- 内容区 -->
<div class="content">{{new.content|default:news.0.content}}</div> <!-- 内容区 -->
{%endblock%}
收尾工作
python manage.py syncdb
python manage.py runserver
admin面板里添加数据