django学习

时间:2025-02-23 20:00:33

语言国际化

  1. 在代码中定义可翻译文本
    from import ugettext_lazy as _
    print _(‘Hello World’)

  2. 编辑.po翻译文件
    django默认加载LOCALE_PATHS路径下的lang/LC_MESSAGES/文件,该文件主要有msgid与msgstr键值对构成。对于中文,文件需包括以下文件头:

msgid ""
msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"

定义APP在admin接口的显示名称

可通过设置AppConfig的verbose_name实现,首先需创建文件,定义如下:

from  import AppConfig

class MyConfig(AppConfig):
    name = 'your name'
    verbose_name = 'your display name'

然后可以项目配置文件的INSTALL_APPS项中,把your app改为your app.MyConfig,或者在你的app的init.py定义default_app_config = ‘your app.MyConfig’

数据库操作

python migrate # 根据INSTALL_APPS和migrations创建或修改数据表
python makemigrations # 每当数据模型改动时,运行该脚本,生成migrations
python sqlmigrate polls 0001 # 以sql语句的形式输出应用polls的0001号migrations
python check 在不生成migrations和访问数据库的情况下,检查数据模型
python shell 在当前project环境下作调试

时区设置

在项目配置文件中设置:

USE_TZ = True
TIME_ZONE = 'Asia/Shanghai'

在MySQL数据库机器上执行以下命令,在mysql数据库上加载时区信息:

mysql_tzinfo_to_sql /usr/share/zoneinfo/ |mysql -h 192.168.1.201 -u root -P 6033 -p mysql

注意 时区信息在整个Server上生效,而不是针对某个数据库
加载完后,需要重新启动MySQL才能生效

mysqladmin -h 192.168.1.201 -u root -P 6033 -p shutdown
mysqld_safe --defaults-file=/etc/mysql/my_all.cnf &

.context_processors说明

名称 字段 说明 字段 说明 字段 说明
csrf csrf_token 抵制跨站攻击token
debug debug True sql_queries sql查询语句
i18n LANGUAGES 可用语言 LANGUAGE_CODE 当前语言编码 LANGUAGE_BIDI
tz TIME_ZONE 时区
static STATIC_URL 静态文件url
media MEDIA_URL media相关内容url
request request 当前请求对象

知识点

给ModelManager添加自定义方法
class BookManager():
    def create_book(self, title):
        book = (title=title)
        # do something with the book
        return book

class Book():
    title = (max_length=100)

    objects = BookManager()

book = .create_book("Pride and Prejudice")
自定义Admin的change_form页面
在外键显示域不显示’—–’选项

重写formfield_for_foreignkey函数,定义empty_label=None

自定义ModelField默认的widget
  • 方法1: 在ModelAdmin中重写formfield_for_dbfield函数, 定义kwargs[‘widget’]变量;
  • 方法2: 在ModelAdmin中定义formfield_overrides变量, 但此种方法会改变所有同种类型ModelField使用的widget, 方法如下:

    formfield_overrides = {
    : {'widget': RichTextEditorWidget},
    }
  • 方法3: 在ModelAdmin自定义form变量, 然后重新声明对应ModelField使用的FormField类型, 方法如下:

    class YourAdmin():
    form = YourForm
    ...
    class YourForm():
    your_field = FormField(widget=your_widget_class)
    ...
    # 或者使用以下方法
    class YourForm():
    class Meta:
    widgets = {
    'your_field_name': your_widget_class()
    }