使用django创建项目(二)

在上一节中,我们通过Django建立了一个“最小”项目(https://github.com/jiaxiaolei/my_django_project)。

这次,我们基于上一个项目,建立一个分支,利用Django Admin 的特性,建立一个简单的“发票汇总”系统。

参考代码:https://github.com/jiaxiaolei/my_django_project.git
djang_invoice 分支

切换分支:

$ git status
# 位于分支 master
无文件要提交,干净的工作区
# 尚未暂存以备提交的变更:

基于当前分支,建立一个分支 django_invoice

$ git checkout -b django_invoice
切换到一个新分支 'django_invoice'

$ git status
# 位于分支 django_invoice

$ git branch
* django_invoice
  master

$ git branch -a
* django_invoice
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

建立一个远程分支:

$ git push origin django_invoice
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:jiaxiaolei/my_django_project.git
 * [new branch]      django_invoice -> django_invoice

修改 module.py,建立models.

filename: project_001/app_001/models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

from django.db import models

# Create your models here.

class User(models.Model): 
    name = models.CharField(max_length=20)
    amount = models.BigIntegerField()
    mobile = models.CharField(max_length=11, blank=True)
    #amount = models.IntField(default=1, required=True) models.BigIntegerField()
    comments = models.CharField(max_length=30, blank=True)

    # 如果不重写__str__方法,默认显示` User object`
    def __str__(self): 
        return "%s" % self.name
    

因为改了model, 需要生产修改并更新table.

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.


$ python manage.py makemigrations
Migrations for 'app_001':
  app_001/migrations/0001_initial.py
    - Create model User

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app_001, auth, contenttypes, sessions
Running migrations:
  Applying app_001.0001_initial... OK

执行python manage.py makemigrations, 会在migrations 下生成一些.py文件,比如:

filename: app_001/migrations/0003_user_mobile.py
# -*- coding: utf-8 -*-
# Generated by Django 1.11.3 on 2017-08-11 12:01
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('app_001', '0002_user_comments'),
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='mobile',
            field=models.CharField(default='', max_length=11),
            preserve_default=False,
        ),
    ]

module 中新增一个字段(比如 comments, mobile)之后,服务出现错误提示:

  File "/root/.virtualenvs/py2.7.13cmdb2.0/lib/python2.7/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/root/.virtualenvs/py2.7.13cmdb2.0/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 886, in execute_sql
    raise original_exception
OperationalError: no such column: app_001_user.comments
[11/Aug/2017 11:56:02] "GET /admin/app_001/user/1/change/ HTTP/1.1" 500 136955
[11/Aug/2017 11:57:42] "GET /admin/app_001/user/1/change/ HTTP/1.1" 200 4971

更新table,并对已有数据提供缺省值。

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app_001, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
(py2.7.13cmdb2.0) [root@uop-test-ad4b7b17-44b1-4657-ab30-8593ece79d7b project_001]# python manage.py makemigrations
You are trying to add a non-nullable field 'comments' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>>
Please enter some code, or 'exit' (with no quotes) to exit.
>>> ''
Migrations for 'app_001':
  app_001/migrations/0002_user_comments.py
    - Add field comments to user
(py2.7.13cmdb2.0) [root@uop-test-ad4b7b17-44b1-4657-ab30-8593ece79d7b project_001]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app_001, auth, contenttypes, sessions
Running migrations:
  Applying app_001.0002_user_comments... OK

$ python manage.py makemigrations
You are trying to add a non-nullable field 'mobile' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> ''
Migrations for 'app_001':
  app_001/migrations/0003_user_mobile.py
    - Add field mobile to user
(py2.7.13cmdb2.0) [root@uop-test-ad4b7b17-44b1-4657-ab30-8593ece79d7b project_001]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app_001, auth, contenttypes, sessions
Running migrations:
  Applying app_001.0003_user_mobile... OK

遇到问题及解决方案

问题:

  File "/root/.virtualenvs/py2.7.13cmdb2.0/lib/python2.7/site-packages/django/template/defaultfilters.py", line 47, in _dec
    args[0] = force_text(args[0])
  File "/root/.virtualenvs/py2.7.13cmdb2.0/lib/python2.7/site-packages/django/utils/encoding.py", line 80, in force_text
    s = six.text_type(bytes(s), encoding, errors)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

解决:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

问题:

    app_config.import_models()
  File "/root/.virtualenvs/py2.7.13cmdb2.0/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/root/.pyenv/versions/2.7.13/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/opt/my_django_project/project_001/app_001/models.py", line 7
    from __future__ import unicode_literals
SyntaxError: from __future__ imports must occur at the beginning of the file

解决:
换一下顺序:from __future__ import unicode_literals 作为第一个要导入的包出现。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

  • 问题: 在admin中建立了普通用户,却无法登陆
  • 解决: 通过系统管理员建立用户的时候,需要勾选“Staff status”, 以便用户可以正常登录系统。
create_user.png

扩展阅读

Admin后台管理模块的使用
http://www.cnblogs.com/alan-babyblog/p/5812010.html

【python】【django】migrate 和makemigrations的差别
http://blog.csdn.net/yang1z1/article/details/52235424
简介:

python manger.py makemigrations

相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件

在此之后执行命令

python manager.py migrate

将该改动作用到数据库文件,比如产生table之类

Django admin 的 list_display 变量统计后台作者发贴总数
http://blog.csdn.net/lmb20056127/article/details/77863492

简介:


一个举例。

对admin进行扩展。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容