后台篇
1、如果在 admin 中取消注册默认的应用(模型)?
比如在安装了 Django APScheduler 执行定时任务时,它默认会注册两个模型并出现在 admin 页面中,此时可通过在应用的 admin.py 文件中使用如下代码在后台中隐藏掉这部分的显示:
1 2 3 4 |
from django_apscheduler.models import DjangoJob, DjangoJobExecution admin.site.unregister(DjangoJob) admin.site.unregister(DjangoJobExecution |
2、如何在后台的表单中禁止某些字段的编辑?
这个操作比较简单,只需在admin.py的XxxAdmin中添加:
1 |
readonly_fields = ['xxx', 'xxx', 'xxx', 'xxx'] |
常用的还有list_display,list_filter,search_fields,inlines等,使用行内编辑时需填写类似Xxx_Inline的值,定义可参考:
1 2 |
class Xxx_Inline(admin.TabularInline): model = Xxx |
3、如何对后台表单中的字段进行分组?
同样在 admin.py 中进行配置,参照如下:
1 2 3 4 5 6 7 8 |
fieldsets = ( ('基本信息', { 'fields': ('nickname', 'homepage', 'email', 'mobile'), }), ('用户评价', { 'classes': ('collapse',), 'fields': ('language_skill', 'communcation_level'), }), |
4、如何在后台列表页面将链接显示为可点击文本?
后台列表页的字段通过list_display进行指定,以主页为例,我们可以在 models.py 中定义一个home_link方法并将其添加到list_display中:
1 2 3 4 |
def home_link(self): from django.utils.safestring import mark_safe return mark_safe("<a href='"+self.homepage+"' target='_blank'>点此访问</a>") home_link.short_description = '主页网址' |
5、The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS
这个原因是DATA_UPLOAD_MAX_NUMBER_FIELDS的默认值为1000,若超过即会报错,可在 settings.py 中进行配置,如10240:
1 |
DATA_UPLOAD_MAX_NUMBER_FIELDS = 10240 |
6、如何使用 Django 维护一个已有数据库的项目呢?
1 2 3 4 5 |
# 在 settings.py 中配置好数据库信息 # 创建模型 python manage.py inspectdb > models.py # 多数据库时指定数据库:--database 指定配置文件:--settings # 对指定表创建模型 python manage.py inspectdb tbl_name > models.py |
7、如何生成多语言文件?
国际化注意有一个坑,就是字母的大小写,在 Ubuntu 等系统会需要首字母大写,所以不要使用zh_hans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 导出翻译文件 mkdir locale django-admin makemessages -l zh_Hans -l en # 编译生成po文件 django-admin compilemessages # url 配置 path('i18n/', include('django.conf.urls.i18n')), # settings 配置 MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ] LANGUAGES = [ ('zh-hans', _('Chinese')), ('en', _('English')), ] LANGUAGE_CODE = 'zh-Hans' USE_I18N = True USE_L10N = True LOCALE_PATHS = ( os.path.join(BASE_DIR, 'locale'), ) |
8、生成配置文件中的 secret
1 2 3 4 5 |
python -c 'from django.core.management.utils import get_random_secret_key;print(get_random_secret_key())' # 通过环境变量读取敏感配置 SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'xxxx') # 上线前安全检查 python manage.py check --deploy |
9、如何防止敏感信息记入日志:
1 2 3 4 5 |
from django.views.decorators.debug import sensitive_variables @sensitive_variables('pwd', 'cc') def process_info(user): pwd = user.password cc = user.credit_card_number |
Django 优化技巧
- 外键
- 一般在数据库设计层面不希望由于外键导致耦合性过高,在 Django 中可通过对字段定义时添加
db_constraint=False
来添加逻辑上的外键,另外 Django 会默认在定义字段名后添加_id
后缀,如果发现有类似报错,可指定db_column
属性。 - 大量使用外键时会发现后台页面速度很慢,这是因为 Django 默认会加载外键中的所有内容,可通过在admin.py 配置中添加
autocomplete_fields
,并在外键对应表中添加search_fields
进行优化:
123456class XxxAdmin(admin.ModelAdmin):search_fields = ('xxx', )class XxxAdmin(admin.ModelAdmin):autocomplete_fields = ('xxx_id',)
- 一般在数据库设计层面不希望由于外键导致耦合性过高,在 Django 中可通过对字段定义时添加
常用插件
- Django Debug Toolbar:查看 debug信息
- Django Silk:性能瓶颈分析
- Django Simple UI:基于Vue Element UI 的后台主题
- Django Haystack:模块化搜索方案
- Django Notifications:消息通知
- Django Markdown Editor:Markdown 编辑器
- Django Crispy Forms:表单
- Django Simple Captcha:Captcha 验证码
- django-ratelimit:限流
- django-prometheus
- Cryptography:数据加密
- django-user-accounts
- django-docker-alpine
- uvicorn-gunicorn-docker
相关资料
DRF篇
1、’AutoSchema’ object has no attribute ‘get_link’
配置文件中添加
1 2 3 4 5 |
REST_FRAMEWORK = { ... 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', ... } |
配置篇
1、smtplib.SMTPSenderRefused: (501, b’mail from address must be same as authorization user’, ‘webmaster@localhost’)
添加如下配置:
1 |
DEFAULT_FROM_EMAIL = 'xxx@xxx.com' |
2、relation “django_site” does not exist
1 2 3 4 |
# 首先查看是否配置了 SITE_ID,如: SITE_ID = 1 #然后执行 python manage.py migrate sites |
3、CommandError: Unable to find a locale path to store translations for file xxxx/__init__.py
在项目根目录下创建 locale 目录,然后再执行
1 |
django-admin makemessages -l zh |