Django管理后台的搭建

安装环境:html

uname -r python

14.04.1-Ubuntu  x86_64 x86_64 x86_64 GNU/Linuxmysql

ubuntu自带python 2.7.6sql

https://www.djangoproject.com/download/下载数据库

django-1.6.11.tar.gzdjango


配置ubuntu机器基本环境ubuntu

root@sige-virtual-machine:~# cat   /etc/network/interfacesvim

# interfaces(5) file used by ifup(8) and ifdown(8)浏览器

auto lobash

iface lo inet loopback

auto  eth0

iface eth0  inet static

address  192.168.1.136

netmask  255.255.255.0

gateway  192.168.1.1

dns-nameservers  8.8.8.8

root@sige-virtual-machine:~# cat  /etc/resolvconf/resolv.conf.d/base

nameserver  8.8.8.8

nameserver  8.8.4.4

nameserver  114.114.114.114


root@sige-virtual-machine:~# resolvconf -u

reboot重启系统

将虚拟机的网络链接到,网络链接桥接模式直接链接物理机,这样子就能够ping  root@sige-virtual-machine:~#www.baidu.com了

 ping -c 3  www.baidu.com

PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.

64 bytes from 61.135.169.121: icmp_seq=1 ttl=50 time=24.3 ms

64 bytes from 61.135.169.121: icmp_seq=3 ttl=50 time=24.2 ms


--- www.a.shifen.com ping statistics ---

3 packets transmitted, 2 received, 33% packet loss, time 2010ms

rtt min/avg/max/mdev = 24.224/24.282/24.341/0.166 ms

修改ubuntu的命令提示符

vim ~/.bashrc

56 PS1='${debian_chroot:+($debian_chroot)}[\u@\h\w]\$ '   ##本身的机器

source ~/.bashrc

这样子提示符就变成本身喜欢的了[root@sige~]#看着真舒服。


怎么用FileZilla链接ubantu系统

sudo apt-get install openssh-server openssh-client 

 /etc/init.d/ssh restart

FileZilla软件里输入sftp://192.168.1.136   sige   123456

其余的很少说了,看的懂得不用说,看不懂的说了也等于白说。

上传本身下载的Django-1.6.11.tar.gz,固然你也能够用wget下载资源。

而后就是源码编译3步走了

tar -zxvf Django-1.6.11.tar.gz 

cd Django-1.6.11/

python setup.py install 

cd  /root

django-admin.py startproject HelloWorld

建立HelloWorld第一个项目

apt-get  install tree

[root@sige~/HelloWorld]# tree

.

|-- HelloWorld

|   |-- __init__.py

|   |-- settings.py

|   |-- urls.py

|   `-- wsgi.py

`-- manage.py

个人项目都在这里了。

python manage.py runserver 0.0.0.0:8000

在浏览器里输入IP和端口

http://192.168.1.136:8000

在先前建立的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:

cat  view.py

from django.http import HttpResponse


def hello(request):

return HttpResponse("Hello world ! ")


接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将如下代码复制粘贴到 urls.py 文件中:

from django.conf.urls import *

from HelloWorld.view import hello


urlpatterns = patterns("",

('^hello/$', hello),

)

整个目录结构以下:

[root@sige~/HelloWorld]# tree

.

|-- HelloWorld

|   |-- __init__.py

|   |-- __init__.pyc

|   |-- settings.py

|   |-- settings.pyc

|   |-- urls.py              # url 配置

|   |-- urls.pyc

|   |-- view.py              # 添加的视图文件

|   |-- view.pyc             # 编译后的视图文件

|   |-- wsgi.py

|   `-- wsgi.pyc

`-- manage.py

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000

完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:

http://192.168.1.136:8000/hello

就出来hello  world!啦

在 HelloWorld 目录底下建立 templates 目录并创建 hello.html文件,整个目录结构以下:

[root@sige~/HelloWorld]# mkdir templates


[root@sige~/HelloWorld]# tree

HelloWorld/

|-- HelloWorld

|   |-- __init__.py

|   |-- __init__.pyc

|   |-- settings.py

|   |-- settings.pyc

|   |-- urls.py

|   |-- urls.pyc

|   |-- view.py

|   |-- view.pyc

|   |-- wsgi.py

|   `-- wsgi.pyc

|-- manage.py

`-- templates

    `-- hello.html

[root@sige~/HelloWorld/templates]# cat hello.html 

<h1>` hello `</h1>

从模板中咱们知道变量使用了双括号。

接下来咱们须要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为[BASE_DIR+"/templates",],以下所示:

[root@sige~/HelloWorld/HelloWorld]# cat settings.py

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

SETTINGS_PATH = os.path.dirname(__file__)

PROJECT_PATH = os.path.join(SETTINGS_PATH, os.pardir)

PROJECT_PATH = os.path.abspath(PROJECT_PATH)

TEMPLATES_PATH = os.path.join(PROJECT_PATH, "templates")  #模板路径

咱们如今修改 view.py,增长一个新的对象,用于向模板提交数据:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat view.py

# -*- coding: utf-8 -*-


#from django.http import HttpResponse

from django.shortcuts import render


def hello(request):

    context          = {}

    context['hello'] = 'Hello World!'

    return render(request, 'hello.html', context)

能够看到,咱们这里使用render来替代以前使用的HttpResponse。render还使用了一个字典context做为参数。

context 字典中元素的键值 "hello" 对应了模板中的变量 "` hello `"。

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000

再访问访问http://192.168.1.136:8000/hello/,能够看到页面:

大写的Hello  World!

模板能够用继承的方式来实现复用。


接下来咱们先建立以前项目的 templates 目录中添加 base.html 文件,代码以下:

[root@sige~/HelloWorld/templates]# pwd

/root/HelloWorld/templates

[root@sige~/HelloWorld/templates]# cat base.html 

<html>

  <head>

    <title>Hello World!</title>

  </head>


  <body>

    <h1>Hello World!</h1>

    {% block mainbody %}

       <p>original</p>

    {% endblock %}

  </body>

</html>

以上代码中,名为mainbody的block标签是能够被继承者们替换掉的部分。

全部的 {% block %} 标签告诉模板引擎,子模板能够重载这些部分。

hello.html中继承base.html,并替换特定block,hello.html修改后的代码以下:

[root@sige~/HelloWorld/templates]# pwd

/root/HelloWorld/templates

[root@sige~/HelloWorld/templates]# cat hello.html 

{% extends "base.html" %}


{% block mainbody %}

<p>继承了 base.html 文件</p>

{% endblock %}

第一行代码说明hello.html继承了 base.html 文件。能够看到,这里相同名字的block标签用以替换base.html的相应block。

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000

从新访问地址http://192.168.45.3:8000/hello/,输出结果以下:

http://192.168.1.136:8000/hello/

Hello World!

继承了 base.html 文件


接下来就是操做数据库了

apt-get install mysql-server

service mysql start

ps aux | grep mysql

mysql -uroot -p123456

mysql> create database  test;

咱们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改成:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat settings.py

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'test',

        'USER': 'root',

        'PASSWORD': '123456',

        'HOST': 'localhost',

        'PORT': '3306',

    }

}

上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户链接起来。


Django规定,若是要使用模型,必需要建立一个app。咱们使用如下命令建立一个 TestModel 的 app:

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py startapp TestModel

目录结构以下:

[root@sige~/HelloWorld]# tree

HelloWorld

|-- TestModel

|   |-- __init__.py

|   |-- admin.py

|   |-- models.py

|   |-- tests.py

|   `-- views.py

咱们修改 TestModel/models.py文件,代码以下:

[root@sige~/HelloWorld/TestModel]# cat models.py

from django.db import models


class Test(models.Model):

    name = models.CharField(max_length=20)

以上的类名表明了数据库表名,且继承了models.Model,类里面的字段表明数据表中的字段(name),数据类型则由CharField(至关于varchar)、DateField(至关于datetime), max_length 参数限定长度。

接下来在settings.py中找到INSTALLED_APPS这一项,以下:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat settings.py


INSTALLED_APPS = (

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles', 

    'TestModel',                           ###添加此项

)

在命令行中运行python manage.py syncdb,看到几行"Creating table…"的字样,你的数据表就建立好了。

[root@sige~/HelloWorld/HelloWorld]# sudo apt-get install python-mysqldb

[root@sige~/HelloWorld/HelloWorld]# python manage.py syncdb


接下来咱们在 HelloWorld 目录中添加 testdb.py 文件,并修改urls.py:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat testdb.py

# -*- coding: utf-8 -*-


from django.http import HttpResponse


#from TestModel.models import Test


# 数据库操做

def testdb(request):

test1 = Test(name='w3cschool.cc')

test1.save()

return HttpResponse("<p>数据添加成功!</p>")

添加数据须要先建立对象,而后再执行 save 函数,至关于SQL中的INSERT:

[root@sige~/HelloWorld/HelloWorld]# cat urls.py

# -*- coding: utf-8 -*-


from django.http import HttpResponse


from TestModel.models import Test


# 数据库操做

def testdb(request):

test1 = Test(name='w3cschool.cc')

test1.save()

return HttpResponse("<p>数据添加成功!</p>")

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


访问http://192.168.1.136:8000/testdb/ 就能够看到数据添加成功的提示。

如何用Django对用户提交的表单数据进行处理?

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat search.py

# -*- coding: utf-8 -*-


from django.http import HttpResponse

from django.shortcuts import render_to_response


# 表单

def search_form(request):

return render_to_response('search_form.html')


# 接收请求数据

def search(request):  

request.encoding='utf-8'

if 'q' in request.GET:

message = '你搜索的内容为: ' + request.GET['q'].encode('utf-8')

else:

message = '你提交了空表单'

return HttpResponse(message)

[root@sige~/HelloWorld/templates]# pwd

/root/HelloWorld/templates

[root@sige~/HelloWorld/templates]# cat search_form.html 

<html>

<head>

<meta charset="utf-8" /> 

    <title>Search - w3cschool.cc</title>

</head>

<body>

    <form action="/search/" method="get">

        <input type="text" name="q">

        <input type="submit" value="Search">

    </form>

</body>

</html>

urls.py 规则修改成以下形式:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat urls.py

from django.conf.urls import *

from HelloWorld.view import hello

from HelloWorld.testdb import testdb

from HelloWorld import search


urlpatterns = patterns("",

('^hello/$', hello),

('^testdb/$', testdb),

(r'^search-form/$', search.search_form),

(r'^search/$', search.search),

)

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000

浏览器里访问地址:http://192.168.1.136:8000/search-form/并搜索,里面填上搜索的内容点击search就看到东西啦。


上面咱们使用了GET方法。视图显示和请求处理分红两个函数处理。

提交数据时更经常使用POST方法。咱们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。

咱们在tmplate 建立 post.html:

[root@sige~/HelloWorld/templates]# pwd

/root/HelloWorld/templates

[root@sige~/HelloWorld/templates]# cat post.html 

<html>

<head>

<meta charset="utf-8" /> 

    <title>Search - w3cschool.cc</title>

</head>

<body>

<form action="/search-post/" method="post">

{% csrf_token %}

<input type="text" name="q">

<input type="submit" value="Submit">

</form>


<p>` rlt `</p>

</body>

</html>

在模板的末尾,咱们增长一个rlt记号,为表格处理结果预留位置。

表格后面还有一个{% csrf_token %}的标签。csrf全称是Cross Site Request Forgery。这是Django提供的防止假装提交请求的功能。POST方法提交的表格,必须有此标签。

在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat search2.py

# -*- coding: utf-8 -*-


from django.shortcuts import render

from django.core.context_processors import csrf


# 接收POST请求数据

def search_post(request):

ctx ={}

ctx.update(csrf(request))

if request.POST:

ctx['rlt'] = request.POST['q']

return render(request, "post.html", ctx)


urls.py 规则修改成以下形式:

[root@sige~/HelloWorld/HelloWorld]# cat urls.py

from django.conf.urls import *

from HelloWorld.view import hello

from HelloWorld.testdb import testdb

from HelloWorld import search

from HelloWorld import search2


urlpatterns = patterns("",

('^hello/$', hello),

('^testdb/$', testdb),

(r'^search-form/$', search.search_form),

(r'^search/$', search.search),

(r'^search-post/$', search2.search_post),

)

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/search-post/ 显示结果有变化啦。



完成以上实例后,咱们的目录结构为:

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# tree

HelloWorld

|-- HelloWorld

|   |-- __init__.py

|   |-- __init__.pyc

|   |-- models.pyc

|   |-- search.py

|   |-- search.pyc

|   |-- search2.py

|   |-- search2.pyc

|   |-- settings.py

|   |-- settings.pyc

|   |-- testdb.py

|   |-- testdb.pyc

|   |-- urls.py

|   |-- urls.pyc

|   |-- view.py

|   |-- view.pyc

|   |-- wsgi.py

|   `-- wsgi.pyc

|-- TestModel

|   |-- __init__.py

|   |-- __init__.pyc

|   |-- admin.py

|   |-- models.py

|   |-- models.pyc

|   |-- tests.py

|   `-- views.py

|-- manage.py

`-- templates

    |-- base.html

    |-- hello.html

    |-- post.html

    `-- search_form.html


3 directories, 29 files


接下来就是Django  Admin管理工具的创建的,很激动呀!!!

[root@sige~/HelloWorld/HelloWorld]# pwd

/root/HelloWorld/HelloWorld

[root@sige~/HelloWorld/HelloWorld]# cat settings.py

INSTALLED_APPS = (

    'django.contrib.admin',             ###这个就是管理工具啦!!!

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'TestModel',

)

一般咱们在生成项目时会在urls.py中自动设置好,咱们只需去掉注释便可。

配置项以下所示:

[root@sige~/HelloWorld/HelloWorld]# cat  urls.py

from django.conf.urls import *

from HelloWorld.view import hello

from HelloWorld.testdb import testdb

from HelloWorld import search

from HelloWorld import search2

from django.contrib import admin

admin.autodiscover()


urlpatterns = patterns("",

('^hello/$', hello),

        ('^testdb/$', testdb),

        (r'^search-form/$', search.search_form),

(r'^search/$', search.search),

        (r'^search-post/$', search2.search_post),

        (r'^admin/', include(admin.site.urls)),

)

启动开发服务器,而后在浏览器中访问:http://192.168.1.136:8000/admin/就能够访问django的管理界面啦!!!

你能够经过命令 python manage.py createsuperuser 来建立超级用户,这个以前已经建立好的就不须要建立了。这个就是登录admin的用户名和密码。

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。

为了让admin界面管理某个数据模型,咱们须要先注册该数据模型到admin。好比,咱们以前在 TestModel 中已经建立了模型 Test 。修改 TestModel/admin.py:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

from TestModel.models import Test


# Register your models here.

admin.site.register(Test)

刷新后便可看到 Testmodel 数据表:

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。

管理页面的功能强大,彻底有能力处理更加复杂的数据模型。

先在 TestModel/models.py 中增长一个更复杂的数据模型:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat models.py

from django.db import models

class Test(models.Model):

    name = models.CharField(max_length=20)

# Create your models here.

class Contact(models.Model):

    name   = models.CharField(max_length=200)

    age    = models.IntegerField(default=0)

    email  = models.EmailField()

    def __unicode__(self):

        return self.name


class Tag(models.Model):

    contact = models.ForeignKey(Contact)

    name    = models.CharField(max_length=50)

    def __unicode__(self):

        return self.name

这里有两个表。Tag以Contact为外部键。一个Contact能够对应多个Tag。

咱们还能够看到许多在以前没有见过的属性类型,好比IntegerField用于存储整数。

在 TestModel/admin.py 注册多个模型并显示:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py


from django.contrib import admin

from TestModel.models import Test,Contact,Tag


# Register your models here.

admin.site.register([Test, Contact, Tag])


刷新管理页面,显示结果就变了:

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。

咱们能够自定义管理页面,来取代默认的页面。好比上面的"add"页面。咱们想只显示name和email部分。修改 TestModel/admin.py:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

from TestModel.models import Test,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    fields = ('name', 'email')


admin.site.register(Contact, ContactAdmin)

admin.site.register([Test, Tag])

咱们还能够将输入栏分块,每一个栏也能够定义本身的格式。修改TestModel/admin.py为:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

from TestModel.models import Test,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    fieldsets = (

        ['Main',{

            'fields':('name','email'),

        }],

        ['Advance',{

            'classes': ('collapse',), # CSS

            'fields': ('age',),

        }]

    )


admin.site.register(Contact, ContactAdmin)

admin.site.register([Test, Tag])

上面的Contact是Tag的外部键,因此有外部参考的关系。

而在默认的页面显示中,将二者分离开来,没法体现出二者的从属关系。咱们可使用内联显示,让Tag附加在Contact的编辑页面上显示。

修改TestModel/admin.py:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

from TestModel.models import Test,Contact,Tag


# Register your models here.

class TagInline(admin.TabularInline):

    model = Tag


class ContactAdmin(admin.ModelAdmin):

    inlines = [TagInline]  # Inline

    fieldsets = (

        ['Main',{

            'fields':('name','email'),

        }],

        ['Advance',{

            'classes': ('collapse',),

            'fields': ('age',),

        }]


    )


admin.site.register(Contact, ContactAdmin)

admin.site.register([Test])


[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。


咱们也能够自定义该页面的显示,好比在列表中显示更多的栏目,只须要在ContactAdmin中增长list_display属性:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

from TestModel.models import Test,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    list_display = ('name','age', 'email') # list


admin.site.register(Contact, ContactAdmin)

admin.site.register([Test, Tag])

搜索功能在管理大量记录时很是有,咱们可使用search_fields为该列表页增长搜索栏:

[root@sige~/HelloWorld/TestModel]# pwd

/root/HelloWorld/TestModel

[root@sige~/HelloWorld/TestModel]# cat admin.py

from django.contrib import admin

#from TestModel.models import Test

from TestModel.models import Test,Contact,Tag


# Register your models here.

#admin.site.register(Test)

#admin.site.register([Test, Contact, Tag])

#class TagInline(admin.TabularInline):

#    model = Tag


class ContactAdmin(admin.ModelAdmin):

#    inlines = [TagInline]  # Inline 

#    fieldsets = (

#        ['Main',{

#            'fields':('name','email'),

#        }],

#        ['Advance',{

#            'classes': ('collapse',), # CSS

#            'fields': ('age',),

#        }]

#    )


     list_display = ('name','age', 'email') # list

     search_fields = ('name',)

admin.site.register(Contact, ContactAdmin)

#admin.site.register([Test, Tag])

admin.site.register([Test])

[root@sige~/HelloWorld]# pwd

/root/HelloWorld

[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000


浏览器访问 http://192.168.1.136:8000/admin/ 显示结果又有变化啦。

相关文章
相关标签/搜索