您的位置:首页 > 编程语言 > Go语言

tango_with_django阅读笔记

2016-05-12 14:17 393 查看
bug solved:9.4.4 写url映射的时候,‘^register/$’ 注意这里/不能丢,要不无法映射

1,创建django项目:

django-admin.py startproject tango_with_django_project


这样会创建一个名叫tango_with_django_project的目录标注1,目录下有两个文件,manager.py以及同名目录tango_with_django_project标注2,同名目录下有init.py,settings.py,urls.py,wsgi.p四个文件。

2,创建django的应用:

步骤一:进入工程目录,即标注1的目录,

python manager.py startapp  rango


这样就创建了名为rango的目录,目录下有5个文件:

init.py,和我们前面说过的功能一样.

models.py,一个存储你的应用中数据模型的地方 - 在这里描述数据的实体和关系.

tests.py,存储你应用的测试代码.

views.py,在这里处理用户请求和响应.

admin.py,在这里你可以向Django注册你的模型,它会为你创建Django的管理界面.

步骤二:在工程同名目录下即标注2,找到settings.py文件,其中的INSTALLED_APPS元组.在元祖的最后面增加rango,目的是让工程识别应用。

3,使用视图函数:

步骤一:rango/views.py 写视图函数;

步骤二:rango/urls.py 添加url()函数,使视图函数与url正则表达式链接,其中的name参数可以是模板使用这个参数标签来引用对应的url;

步骤三:tango_with_django/urls.py 添加 urls(r’rango/’,include(‘rango.urls’));目的是使应用的urls被项目识别,其实也可以直接在项目文件中直接写url,之所以不这样做是为了解耦合。

4,使用模板(共4步):

first在工程下建立模板目录:

templates/rango

second 在settings中设置链接建立的模板目录:

settings>>TEMPLATES = [{TEMPLATE_PATH}],其中TEMPLATE_PATH=os.path.join(BASE_DIR,’templates’)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))

这里解决了两个问题,os.path.join 解决了不同操作系统的路径名的不同分隔符的问题,os.path.dirname解决了硬编码问题,即建议使用相对路径,不用绝对路径,否则程序不便移植。

third ,在模板目录templa/rango下添加html文件,注意{{a}}是可以代表视图函数传来的变量;

forth,在rango/view.py 中添加视图函数 ,用render渲染,此时render会自动去template目录下找html文件,比如rango/index.html

5,使用静态文件,包括图片,js,css(共四步):

first:在工程目录下设置目录并放置图片,比如:static;可以在static下再设置一个目录便于区分,即static/image/rango.jpeg

second:在settings文件里告知目录位置,

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
STATIC_PATH = os.path.join(BASE_DIR,'static')  #非必须
STATICFILES_DIRS = (         #非必须
STATIC_PATH,
)


这里讲一下三个参数的区别(STATIC_PATH归到STATICFILES_DIRS中),首先URL与ROOT是必须参数,URL是负责供给模板html使用,如果是本地环境,其实代表127.0.0.1:5000/static;

ROOT是django将查找静态文件的功能交给服务器之后,服务器要查找的静态文件的路径,这里URL其实就是指向ROOT,在部署阶段,只要运行命令:

python manage.py collectstatic   #先搜索再复制


django就自动搜索每个应用目录下的static文件夹里的文件,以及STATICFILES_DIRS设置的目录的文件,将所有文件复制到ROOT所指定的目录下,以便供给服务器去查找,所以这里可以看出STATICFILES_DIRS不是必须的,当然如果你如果将静态文件放在除应用目录下的static与工程目录下的static之外的其他目录,那就需要设置。

总结一下:STATICFILES_DIRS是各种源静态文件目录;

STATIC_ROOT 是目的静态文件目录,是将源静态文件集中到了一起,方便使用;

STATIC_URL 是html去使用静态文件的目录,指向STATIC_ROOT;

third:在项目里的urls利用setting里面的设置:

if not settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
if settings.DEBUG:
urlpatterns += [
url(r'^static/(?P<path>.*)$', views.static.serve, {'document_root': settings.STATIC_ROOT}, name="static"),]


forth:在html中使用静态文件:

{% load staticfiles %}
< img src = "{% static " images/rango.jpeg" %}" />


html中的load staticfiles其实指的就是django.contrib.staticfiles ,而html中static指的就是127.0.0.1:8000/static/(如果是本地情况下),其实static标签就是url中名为name=’static’的url;。

参考链接:http://m.oschina.net/blog/198768

6,静态媒体服务(大致五步):

first:在工程目录下新建media目录

second:setting设置路径:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


third:url使用设置的路径:

url(r'^media/(?P<path>.*)$', views.static.serve, {'document_root': settings.MEDIA_ROOT}, name="media")


forth:在model数据库模型中设置相应字段:

picture = models.ImageField(upload_to='profile_images', blank=True)


ImageField字段有一个upload_to属性.这个属性值连接着MEDIA_ROOT设置用来提供上传文档图片的路径.例如,MEDIA_ROOT设置为/tango_with_django_project/media/,那么upload_to=profile_imges将会使图片保存在/tango_with_django_project/media/profile_images/目录.

fifth:html文件里的设置:

<form id="user_form" method="post" action="/rango/register/"
enctype="multipart/form-data">


当你希望用户通过表单上传文件时,必须把enctype设置成multipart/form-data.这个属性会让你的浏览器以特定的方式把表单数据返回给服务器.

7,模型与数据库的使用(5+3步):

first:settings.py里添加一个叫做DATABASES的字典(sqlite是自动添加的):

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}


second:rango/models.py里定义模型,注意类继承models.MODEL;以及ForeignKey;还有unicode()方法

third:如果第一次用连数据库都没有创建,则:

$ python manage.py migrate


这条命令会创建数据库表;

forth:如果之前已经有数据库表,只是对其改动,则:

$ python manage.py makemigrations rango  #为这些修改创建迁移文件
$ python manage.py migrate  #将这些改变更新到数据库中


fifth:设置输入数据脚本,比如create_data.py:

import django
django.setup()
from rango.models import Category, Page
def populate():
def add_cat(name):
c = Category.objects.get_or_create(name=name)[0]
return c   #get_or_create返回的是(object,created)并且代替了 c=Category(name=name)
#c.save()
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
return p
python_cat = add_cat('Python')

add_page(cat=python_cat,
title="Official Python Tutorial",
url="http://docs.python.org/2/tutorial/")
if __name__ == '__main__':
populate()


以上基本的数据库创建已完成,6,7步介绍创建django自带的数据库后台管理系统:

sixth:创建管理员来管理数据库:

$ python manage.py createsuperuser


seventh:设置管理界面,rango/admin.py文件中:

from django.contrib import admin
from rango.models import Category, Page

admin.site.register(Category)
admin.site.register(Page)


eighth:定制你的数据库后台管理:

你需要修改rango/admin.py文件,创建PageAdmin类,这个类继承自admin.ModelAdmin;在PageAdmin类里,加入list_display = (‘title’, ‘category’, ‘url’);最后注册PageAdmin类到Django管理界面.需要修改admin.site.register(Page).在Rango的admin.py文件里修改成admin.site.register(Page, PageAdmin)

8,将数据库的内容显示在html上(3步):

first:假设已完成7,即确保数据库中已经有数据;

second:在视图函数中导入数据库模型;实例化(c=Catotery.objects.all());将实例当做字典用render()传给前端模板。

third:在前端模板中用变量表示出来。作为模板语言,所有的命令都包含在{%和%}标签里,所有的变量都在{{和}}里.

9,在Category添加slug字段:

first:重写Category模型的save方法,我们将会调用slugify方法并更新slug字段:

from django.template.defaultfilters import slugify
class Category(models.Model):
# 。。。。
slug = models.SlugField(unique=True)

def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)


second:视图函数中添加catetory函数:

def category(request, category_name_slug):
#。。。
category = Category.objects.get(slug=category_name_slug)


third:添加category.html,并修改index模板:

<li><a href="/rango/category/{{ category.slug }}">{{ category.name }}</a></li>


forth:修改rango的urls.py文件和urlpatterns元组

url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category'),


10,使用表单,增加目录条目使用(4加1步):

first:创建表单类,django的表单类是直接跟数据库模型直接相关,在rango/forms.py中:

class CategoryForm(forms.ModelForm):
name = forms.CharField(max_length=128, help_text="Please enter the category name.")
views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
likes = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
slug = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
model = Category
fields = ('name',)
class PageForm(forms.ModelForm):
title = forms.CharField(max_length=128, help_text="Please enter the title of the page.")
url = forms.URLField(max_length=200, help_text="Please enter the URL of the page.")
views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)

class Meta:
model = Page
exclude = ('category',)


second:视图函数rango/views.py:

def add_category(request):
if request.method == 'POST':
form = CategoryForm(request.POST)
if form.is_valid():
form.save(commit=True)
return index(request)
else:
print form.errors
else:
form = CategoryForm()
return render(request, 'rango/add_category.html', {'form': form})


third:表格模板html的编写,templates/rango/add_category.html:

<form id="category_form" method="post" action="/rango/add_category/">

{% csrf_token %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}

{% for field in form.visible_fields %}
{{ field.errors }}
{{ field.help_text }}
{{ field }}
{% endfor %}

<input type="submit" name="submit" value="Create Category" />
</form>


链接模板html的编写,rango/index.html:

<a href="/rango/add_category/">Add a New Category</a><br />


forth:映射url,rango/urls.py:

url(r'^add_category/$', views.add_category, name='add_category'),


fifth:设想有时候用户输入并不是一定正确,我们可以重写ModelForm模块里clean()方法.这个方法会在表单数据存储到模型实例之前被调用,所以它可以让我们验证甚至修改用户输入的数据.在我们上面的例子中,我们可以检查url字段的值是否以http://开头 - 如果不是我们可以在用户前面添加上http://

class PageForm(forms.ModelForm):
...

def clean(self):
cleaned_data = self.cleaned_data
url = cleaned_data.get('url')
if url and not url.startswith('http://'):
url = 'http://' + url
cleaned_data['url'] = url

return cleaned_data


11,用户验证(登陆,登出,注册等):

两种方法,一种自己写;第二种django提供了一个插件django-registration-redux,安装这个包,可以不用写模型,直接应用,但是也要写前端,前端的描述也变得简单,详见:http://hackerxu.com/Twd/#12-drr

12,使用bootstrap模板写前端:

大体思路是在基模板中引入bootstrap的css与js文件,之后其他前端模板只要继承基模板就好了,所以基模板比较复杂,其他还好,base.html中,添加css与js文件,这样就可以用bootstrap了,这跟django没关系,前端要用bootstrap都可以这么用:

<head>
...
<meta name="viewport" content="width=device-width, initial-scale=1">

...
<link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">

...
</head>
<body>
...
<script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
...
</body>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: