奥门威尼斯网址Django 1.0.1发布

by admin on 2019年12月15日

<1> CharField
#字符串字段, 用于较短的字符串.
#CharField 要求必须有一个参数 maxlength,
用于从数据库层和Django校验层限制该字段所允许的最大字符数.

遵循之前公布的Django版本开发计划,Django
1.0.1今天发布了。这只是一个bug修复的新版本,提升了Django代码质量,如果你使用Django
1.0版本,强烈建议你升级到新版本。详细发布信息请查看:the 1.0.1 release
notes下载访问:the downloads page安全性能方面访问:a file containing
checksums of the 1.0.1 package

升级过程中碰到的一些注意点,拿出来与大家分享,希望对正在或需要升级项目的朋友有帮助。

我恨Django的5个理由虽然我喜欢Django,但是无论如何它也有瑕疵的,让我先把”丑话”说在前面吧.Ajax很难和Django一起用大部分的Django社区都认为把Javascript
helpers和python
framework放到一起并不是个很好的主意。虽然我理解Javascrip是基本知识,人人都懂得一些,但是我仍然不赞同这个主意。SQL和Javascript一样也是基本知识,但是我们仍然要ORM来提炼出共用和重复的内容。当然,通过simplejson和JQuery,能够快速的建立Ajax应用。但是在Python和Javascript之间频繁切换让人很头痛。缺少identity
map
如果你用Model.objects.get从某数据库中两次获取相同的一行,你会得到不同的对象.除了两次查询的性能问题以外,当你只需要更新其中一个对象而另外一个不更新时,你会发现很有意思的事情。另外,你如果同时更新两者,数据库可能会出现前后不一致的结果。这里是一个例子:

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', views.home),
]

r'^$'表示匹配一个空字符串
views.home对URL / 的请求转到home视图
r'^hello/$'可以匹配URL/hello,此时访问http://127.0.0.1:8000/hello
可以跳转到home视图

<2> IntegerField
#用于保存一个整数.

1、URL

Django1.6中使用的是如下代码

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index')
)

在Django1.10版本中,patterns方法已经被移除了,换成url即可:

from django.conf.urls import url

from polls import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]
See this codeIn [2]: from django.contrib.auth.models import UserIn [3]: usr1 = User.objects.create_user('ram', 'demo@demo.com', 'demo')In [4]: usr2 = User.objects.get(username='ram')In [5]: usr3 = User.objects.get(username='ram')In [6]: user2 == user3—————————————————————————NameError Traceback (most recent call last)…In [7]: usr2 == usr3Out[7]: TrueIn [8]: usr3.username = 'not_ram'In [9]: usr3.save()In [10]: usr2.usernameOut[10]: u'ram'In [11]: us3.username—————————————————————————NameError Traceback (most recent call last)…In [12]: usr3.usernameOut[12]: 'not_ram'In [13]: usr2 == usr3Out[13]: True

views.py

from django.http import HttpResponse
def home(request):
    return HttpResponse('hello, world')

<3> FloatField
# 一个浮点数. 必须 提供两个参数:
#
# 参数 描述
# max_digits 总位数(不包括小数点和符号)
# decimal_places 小数位数
# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
#
# models.FloatField(…, max_digits=5, decimal_places=2)
# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
#
# models.FloatField(…, max_digits=19, decimal_places=10)
# admin 用一个文本框(<input type=”text”>)表示该字段保存的数据.

2、django-extensions

如果在项目中使用了django-extensions,并且版本低于1.5.9,那么在项目升级的过程中,也要把django-extensions升级到1.5.9版本。

命令直接用

pip install django-extensions==1.5.9

你可以在settings.py里面设置SESSION_EXPIRE_AT_BROWSER_CLOSE
来定义session类型。但是你不能按用户设置他们。这虽然是个次要问题,但是你仍然不得不每个应用都这样弄下,我好像记得不这样做的话,函数是不能运行的。NewForms非常有限比如你需要form包含不定数量的field.你会如何用NewForms类来做这个事情

<4> AutoField
# 一个 IntegerField, 添加记录时它会自动增长.
你通常不需要直接使用这个字段;
#奥门威尼斯网址, 自定义一个主键:my_id=models.AutoField(primary_key=True)
# 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.

3、django-cors-headers

如果在项目中使用了django-cors-headers,由于Django1.10已经不支持这个组件了,推荐使用django-cors-middleware,具体命令如下。

首先移除django-cors-headers:

pip uninstall django-cors-headers

如果权限不够的话,在前面加上 sudo

然后安装django-cors-middleware

pip install django-cors-middleware

如果权限不够的话,在前面加上 sudo

from django import newforms as formsclass MyForm(forms.Form): foo = froms.CharField() bar = froms.CharField()

<5> BooleanField
# A true/false field. admin 用 checkbox 来表示此类字段.

4、South

如果在1.6版本项目中使用了South的话,还要做一下迁移的工作。步骤如下:

  1. 确认所有的installs都以South创建的迁移完全更新。就是确认全部是要更新的。
  2. 从INSTALLED_APPS 中移除
    ‘south’。
  3. 删除你所有的迁移文件(编号标识的),但不能删除所在目录或
    __init__.py (切记不可删除__init__.py),也需确认删除
    .pyc文件。
  4. 运行 python manage.py makemigrations.
    Django应该看到空的迁移目录,并以新的格式进行新的初始迁移。
  5. 执行python manage.py migrate --fake-initial。Django会看到初始迁移的表已经存在,并将它们标记为已应用,而不运行它们。(Django不会检查表模式是否与您的模型匹配,只是正确的表名存在)。

迁移参考链接:http://python.usyiyi.cn/translate/django\_182/topics/migrations.html

这样只能创建固定数量的field.当然也有方法来创建不定数量field,但是并不很容易或者说不容易优雅的实现这一点。配置信息混淆了公共信息和隐秘信息比如我发布一个应用,里面有一个MIDDLEWARE_CLASSES参数,我不希望别人修改这个。同样的,大部分情况下,INSTALLED_APPS,应该是用户不能修改的,(除非你发布独立应用)。这意味着必须对
settings.py 进行版本管理,但是里面又包含了数据库信息,和 SECRET_KEY
之类的不能够进行版本控制的内容,这又表明不能对settings.py进行版本控制。就
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘settings’
这句来说,settings.py需要重新制定。另:两个曾经困扰我的问题已经解决:
1.不能继承Models。现在可以用query-refactor完成。2.URL和View的映射曾经是个问题,但是regexes外美的解决了这个问题。我爱Django的5个理由说完了我讨厌Django的理由,下面该说说我为什么喜欢Django了:很棒的Admin
interface
我曾经给一些人演示过Django,在models.py写几行代码就可以生成Admin
interface,让人惊讶得下巴都快掉了.每次演示都是这么简单,在这里,你可以看到很多人都不相信这么简单,并且怀疑里面是不是隐藏了代码.当然Admin不只是炫耀的工具,当我做一个新的站点的时候,我会先写views来查询数据库,所以Admin是不可或缺的.在大部分情况下,写写Model,玩玩Admin对我来说就足够了.内容全面更新及时的文档当时我在网上寻找python框架找很久,最后不得不在Django和Turbogears中间选择一个.由于Django的文档写的更好,而且还有更多的教程,所以最后我投向了Django的怀抱.社区的支持无论我在django-users和IRC#Django问什么问题,都能得到很多热心的回复帖子.据我所知很少社区有这样的文化,所谓的牛人都很愿意帮助新人.很多可重用的组件/插件django-mptt
可以用来进行对关联性数据的处理,如果需要做一些投票,注册或者wiki之类的小功能,可以到这里去看看.让事情变得容易,让不可能变为可行如果需要做一些查询如:SELECT
* FROM … WHERE …, 就用Model.objects.filter.
如果你需要查询大量关系类型数据的话,那么可以用select_related.如果你需要对一个关系建模,而Django
ORM用不上的话,那么可以在extra写sql的方式.有很多GROUP BY或者UNION
ALL之类的SQL要处理?
可以试下connection.cursor.根据你的需要,这些小东西可以让你做的事情变得很简单.和模版的观念类似,如果你需要替换变量的话,这里有{%
for … %}和{{ …
}}可以使用.如果是更复杂的模版,则可以使用模版标签我的分析有道理吗?那么你是爱Django还是恨Django呢?理由是什么?

<6> TextField
# 一个容量很大的文本字段.
# admin 用一个 <textarea>
(文本区域)表示该字段数据.(一个多行编辑框).

5、Templates

在升级之后,原来项目中settings.py中对于TEMPLATES的设置也失效了。

原项目的设置为:

TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, 'frontend/dist/'),
)

升级之后修改为:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(PROJECT_ROOT, 'frontend/dist/')],
        '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',
            ],
        },
    },
]

<7> EmailField
# 一个带有检查Email合法性的 CharField,不接受 maxlength 参数.

<8> DateField
# 一个日期字段. 共有下列额外的可选参数:
# Argument 描述
# auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示
“last-modified” 时间戳.
# auto_now_add
当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
#(仅仅在admin中有意义…)

<9> DateTimeField
# 一个日期时间字段. 类似 DateField 支持同样的附加选项.

<10> ImageField
# 类似 FileField,
不过要校验上传对象是否是一个合法图片.#它有两个可选参数:height_field和width_field,
# 如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
<11> FileField
# 一个文件上传字段.
#要求一个必须有的参数: upload_to,
一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime
#formatting,
#该格式将被上载文件的 date/time
#替换(so that uploaded files don’t fill up the given directory).
# admin 用一个<input
type=”file”>部件表示该字段保存的数据(一个文件上传部件) .

#注意:在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
#(1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让
Django在此处保存上传文件.
# (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL
作为该目录的公共 URL. 要确保该目录对
# WEB服务器用户帐号是可写的.
#(2) 在你的 model 中添加 FileField 或 ImageField, 并确保定义了
upload_to 选项,以告诉 Django
# 使用 MEDIA_ROOT
的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于
MEDIA_ROOT).
# 出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url
函数.举例来说,如果你的 ImageField
# 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }}
这样的方式得到图像的绝对路径.

<12> URLField
# 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL
会预先检查是否存在( 即URL是否被有效装入且
# 没有返回404响应).
# admin 用一个 <input type=”text”>
文本框表示该字段保存的数据(一个单行编辑框)

<13> NullBooleanField
# 类似 BooleanField, 不过允许 NULL 作为其中一个选项.
推荐使用这个字段而不要用 BooleanField 加 null=True 选项
# admin 用一个选择框 <select> (三个可选择的值: “Unknown”, “Yes”
和 “No” ) 来表示这种字段数据.

<14> SlugField
# “Slug” 是一个报纸术语. slug 是某个东西的小小标记(短签),
只包含字母,数字,下划线和连字符.#它们通常用于URLs
# 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定,
Django 会使用默认长度: 50. #在
# 以前的 Django 版本,没有任何办法改变50 这个长度.
# 这暗示了 db_index=True.
# 它接受一个额外的参数: prepopulate_from, which is a list of fields
from which to auto-#populate
# the slug, via JavaScript,in the object’s admin form:
models.SlugField
# (prepopulate_from=(“pre_name”, “name”))prepopulate_from 不接受
DateTimeFields.

<13> XMLField
#一个校验值是否为合法XML的 TextField,必须提供参数: schema_path,
它是一个用来校验文本的 RelaxNG schema #的文件系统路径.

<14> FilePathField
# 可选项目为某个特定目录下的文件名. 支持三个特殊的参数,
其中第一个是必须提供的.
# 参数 描述
# path 必需参数. 一个目录的绝对文件系统路径. FilePathField
据此得到可选项目.
# Example: “/home/images”.
# match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField
将使用它过滤文件名.
# 注意这个正则表达式只会应用到 base filename 而不是
# 路径全名. Example: “foo.*\.txt^”, 将匹配文件 foo23.txt 却不匹配
bar.txt 或 foo23.gif.
# recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path
下面的全部子目录.
# 这三个参数可以同时使用.
# match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
# FilePathField(path=”/home/images”, match=”foo.*”, recursive=True)
# …会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif

<15> IPAddressField
# 一个字符串形式的 IP 地址, (i.e. “24.124.1.30”).
<16># CommaSeparatedIntegerField
# 用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图