django-1.8学习记录(1)

这里的python的版本为2.7  django版本为1.8  IDE使用的是PyCharm

参考:http://emagic.blog.51cto.com/2204463/1587025

一、创建一个Django项目

django-admin startproject mysite(项目名称)

二、创建应用,进入到项目目录下面

python manage.py startapp polls

三、建立数据模型,在APP下面,这里是polls,编辑models.py文件

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

四、修改settings.py文件

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
)

数据库django默认使用sqlite3,如果你想用mysql修改如下

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myapp',
        'USER': 'root',
        'PASSWORD': '000000',
    }
}

修改语言

LANGUAGE_CODE = 'zh-hans'

五、同步模型到数据库

在doc命令提示符下运行如下命令:

检查前面写的models.py是否有错误

 

在这里还可以使用python manage.py syncdb命令

同步成功

 

创建后台管理员账号

 六、启动项目

这里可以使用PyCharm启动也可以用命令启动

 七、登录后台

 八、在后台注册APP

编辑polls下面的admin.py文件

from django.contrib import admin
from polls.models import Question

# Register your models here.
admin.site.register(Question)

这样django就知道要把polls应用的Question添加到后台

点击Questions进入polls的管理页面,现在什么都没有,点击右上角的”增加question“来添加一项:

这时显示的是一个question对象,没有显示实际的内容,怎么样显示呢?我们来修改一下,编辑polls下的models.py文件,给

两个class分别加上__unicode__()方法:

from django.db import models

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __unicode__(self):  #python3上面使用__str__
        return self.question_text

class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __unicode__(self): #python3上面使用__str__
        return self.choice_text

 

九、定制管理后台

上面这个新增Question的页面样式是不是一成不变的呢?事实上,Django给我们准备了丰富的定制手段,比如我们要把发布日期和Question text的顺序调换一下,就这么做:

编辑polls下面的admin.py文件:

from django.contrib import admin
from polls.models import Question


class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

刷新一下浏览器,编辑页面变成了这样:

当你只有两个字段的时候,谁先谁后其实无关紧要,但当字段数量变成十几个,甚至几十个的时候,字段的顺序就变得重要起来了。

讲到”大量字段“这个话题的时候,我们可能会用到”把字段分组“这个技巧,再编辑polls下面的admin.py文件:

from django.contrib import admin
from polls.models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Question, QuestionAdmin)

继续延伸这个话题,如果我们的表单很长,这时我们可能会想到要将某些字段”折叠“起来,那么,酱紫做:

继续编辑polls下面的admin.py文件:

from django.contrib import admin
from polls.models import Question

# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,{'fields': ['question_text']}),
        ('DateTime', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]

admin.site.register(Question, QuestionAdmin)

 十、添加关联对象

我们的投票应用还少了一部分:投票的选项还没加到管理界面中来。要实现这个其实很简单,我们有两种方式。

第一种方式是在admin.py中注册Choice,以便让它显示到管理界面中。

编辑polls下面的admin.py文件:

from django.contrib import admin
from polls.models import Choice, Question
# ...
admin.site.register(Choice)

这样Choice就被添加到管理界面中来了:

点击Choices后边的”增加“按钮:

在这个”增加choice“界面中,我们可以在”Question“后边选择已经添加好的问题,然后逐个输入对应的选项——通常每一个投票会有好几个选项可供选择。

好了,问题来了,这样的方式是够简单了,但当你一次性添加好多内容的时候,你每添加一项choice都要在Question后面重新选择问题,内容一多,这就成了件苦差使。有没有更简便的方法?

我们来看第二种方式:

编辑polls下面的admin.py文件,移除”admin.site.register(Choice)“这一行,然后添加内容:

from django.contrib import admin
from polls.models import Choice, Question


class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

这等于是在告诉Django,Choice这个对象我们要在Question界面中编辑,默认情况下,一个Question下配上3个Choice,来看下具体的效果吧:

当我们要为一个Question配4个Choice怎么办?很简单,点击上图下方的”添加另一个Choice“链接就行。

还有一个小问题,这样的显示方式,也太占地方了!能不能让布局简洁些?

我们只要改动一个地方,编辑polls下的admin.py,改动ChoiceInline这一行:

class ChoiceInline(admin.TabularInline):

把显示样式由StackedInline改为TabularInline。看下效果:

十一、改进

我们来看一下那个显示所有Question的列表页面,如下图所示,它只显示了Question这一个字段,有没有可能让显示的字段更多一些呢?

我们可以使用list_display这个选项来实现,编辑polls/admin.py,加上一行:

polls/admin.py :

class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date')

看一下,效果出来了:

我们希望看到更多的信息,比如,这个Question是否最近发布的。我们可以在模型中添加一个叫“was_published_recently”的字段来实现它。

编辑polls/models.py,让它变成:

polls/models.py:

import datetime

from django.db import models
from django.utils import timezone


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

编辑polls/admin.py,作如下改动:

polls/admin.py :

class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date', 'was_published_recently')

看下效果:

我们可以点击每一栏位的标题对其进行排序操作——除了'was_published_recently ?'这一栏,因为这个字段并非数据库自身的字段,而是我们“造”出来的。

不过我们也有办法让它参与排序,并且改进一下显示的方式。

编辑polls/models.py,让它变成下面这个样子:

polls/models.py:

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

刷新一下浏览器:

现在,'was_published_recently ?'这一栏也可以参与排序了,它用来排序的字段是“pub_date”。

 

Django的admin模块还给我们提供了过滤器的功能,我们可以利用list_filter语句来给“pub_date”字段添加一个过滤器。

编辑polls/admin.py,在QuestionAdmin下添加一行:

polls/admin.py :

list_filter = ['pub_date']

我们可以看到,右侧多了一个叫”过滤器“的侧边栏,你可以使用”今天“、”过去7天“、”本月“、”今年“等条件来对当前显示内容进行过滤。

如果内容一多,我们想快速定位某一个投票项怎么办?

我们可以很方便地添加一个搜索功能。

编辑polls/admin.py,在QuestionAdmin下添加一行:

polls/admin.py :

search_fields = ['question_text']

在列表上方多出了一个搜索文本框,就是这么简单。

十二、定制管理页面外观

每个管理页面的顶部都挂着”Django管理“有时看起来很傻。不过你放心,这个是可以替换的。

在我们的项目文件夹(最顶层的mysite文件夹)中建立一个叫templates的文件夹,这样我们的项目文件夹的结构就变成下面这样:

mysite/
    manage.py
    mysite/
    polls/
    templates/

我们需要修改一下mysite/settings.py文件:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates').replace("\\", "/")
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

然后在templates文件夹下建立一个admin文件夹,并从Django源代码包的C:\Python27\Lib\site-packages\django\contrib\admin\templates\admin(我的这个是再Windows系统下面的路径)文件夹下复制一个叫base_site.html的文件到admin文件夹下。修改

如下:

 我们还可以修改整个后台的索引页,用上面的方法从Django源代码包中复制admin/index.html文件过来,然后进行编辑。

posted @ 2017-01-15 10:20  可可怪  阅读(90)  评论(0)    收藏  举报