一、安装项目的过程:
命令行输入:django -admin startproject myblog
创建一个项目
启动服务器:python manage.py runserver 8080
(更改端口)
加载模板:在setting中配置
创建app : python manage.py startapp books
二、数据库配置
setting.py中
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': '',
'USER': '',
'HOST': '127.0.0.1',
}
}
测试你的数据库配置:
from django.db import connection
cursor = connection.cursor()
在model.py中定义数据库中的字段;
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
要进行模型安装:
将 books app 添加到配置文件的已安装应用列表中即可完成此步骤
验证模型的有效性: python manage.py validate
生成数据库表: python manage.py makemigrations app名称/默认所有
再执行 python manage.py migrate
数据迁移
运行下面的命令来生成 CREATE TABLE 语句: python manage.py sqlall books
sqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来:
提交SQL语句至数据库的方法: syncdb
命令 python manage.py syncdb
四、一个注意点:
对于每个app下面的模板,需要在templates下面新建以app名字相同的文件夹以区分
name参数就是用来解决此问题的。name用来唯一区一个视图对应多个urlconf的场景。通过name来反向获取URL。
url()函数中有四个参数
kwargs
kwargs就是一个字典类型的参数,它的使用方式如:
五、将你的Models加入到Admin管理中
注册一下:
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
六、模板加载机制:
get_template()方法会自动为你连接已经设置的 TEMPLATE_DIRS目录和你传入该法的模板名称参数。比如,你的 TEMPLATE_DIRS目录设置为 ‘/home/django/mysite/templates’,上面的 get_template()调用就会为你找到
os.path.dirname(os.path.dirname(file)) #指的是 当前文件所在目录的所在目录,即上一层文件夹。
七、高级url配置问题
我们可以把公共的前缀提取出来,作为第一个参数传给\ “函数:
urlpatterns = patterns(**'mysite.views'** ,
(r'^hello/$', **'hello'** ),
(r'^time/$', **'current_datetime'** ),
(r'^time/plus/(d{1,2})/$', **'hours_ahead'** ),
)
在关键字参数调用中,你要指定参数的名字和传入的值。 在位置参数调用中,你只需传入参数,不需要明确指明哪个参数与哪个值对应,它们的对应关系隐含在参数的顺序中。
无名组的 URLconf 的例子:
urlpatterns = patterns('',
(r'^articles/(\d{4})/$', views.year_archive),
(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)
命名组进行了重写:
urlpatterns = patterns('',
(r'^articles/(?P<year>\d{4})/$', views.year_archive),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)
语法:?P<name>pattern
八、传递额外的参数到视图函数中
比如说,你有两个视图,它们的内容是一致的,除了它们所用的模板不太一样:
urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^foo/$', views.foo_view),
(r'^bar/$', views.bar_view),
)
views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foo_view(request):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response('template1.html', {'m_list': m_list})
def bar_view(request):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response('template2.html', {'m_list': m_list})
解决办法:
URLconf里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典:
urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)
views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, template_name):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response(template_name, {'m_list': m_list})