Django自带了强大的名为admin
的后台管理功能,app名称为django.contrib.admin
,它同时依赖了django.contrib.auth
认证系统和django.contrib.sessions
系统,当然,即使不用admin,后面两者都建议加上,不用重复造轮子。
为了使用它,我们需要先使用
migrate
功能去创建相应的数据库表,直接执行python manage.py makemigrations && python manage.py migrate
即可。运行程序后,直接访问http://127.0.0.1:8000/admin/
就能访问admin了(一般admin的路由都是定义好了的,在urls.py
中有url(r'^admin/', admin.site.urls),
)我们需要先创建一个超级管理员
python manage.py createsuperuser
,按照提示输入用户名密码即可用来登录了如果要让字段非必填,需要在定义model字段的时候就加上
blank=True
参数修改超级管理员密码可以这样做:
1
2
3
4
5# python manage.py shell
from django.contrib.auth.models import User
user =User.objects.get(username='admin')
user.set_password('new_password')
user.save()
使用admin管理数据表
为了管理具体的某张表,我们需要在app下的admin.py
文件里面注册相应的model
:
1 | from django import forms |
自定义admin管理数据创建及修改表单
1 | class MyModelCreationForm(forms.ModelForm): |
admin中字段动态hide与show
- 目前没有找到更好的方法,不过可以直接用
class Media: js=()
来自定义js文件,通过jQuery来实现
自定义字段的样式及js逻辑
- 如果要发送
ajax
请求,获取csrf_token
放在header里,可以通过$('input[name=csrf_token]').val()
获取
Django-CKeditor富文本编辑使用
django-ckeditor
扩展,使用简单,前端也漂亮
安装
pip install django-ckeditor
,如果要在富文本里添加图片还需要pip install pillow
注册应用,
INSTALLED_APPS
里添加ckeditor
,图片还需要添加ckeditor_uploader
如果要使用自定义的文件存储,例如七牛云存储,可以参考这篇文章进行设置
如果要处理图片,还需要在
settings.py
里面添加如下设置:1
2
3
4
5
6
7
8
9
10
11
12# 前面两个可能已经设置了,是存放用户上传文件的地方
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
CKEDITOR_UPLOAD_PATH = 'upload/'
CKEDITOR_CONFIGS = { # 添加个性化的配置
'default': {
'image_previewText':' ', # 替换图片显示区域那一串搞不懂的字符串
'tabSpaces': 4,
}
}另外还需要添加一个路由用于上传请求
1
2
3
4
5
6from django.conf.urls.static import static
urlpatterns = [
...
path('ckeditor/', include('ckeditor_uploader.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)模型里面对应的字段设置
1
2
3
4
5from ckeditor.fields import RichTextField
class Post(models.Model):
content = RichTextField()
content2 = RichTextUploadingField() # 带有上传图片功能的富文本编辑Django-CKeditor
目前还不支持粘贴的时候自动上传图片,我的做法是在对象的Admin
的save_model
方法里面对没有转换为内链的外部链接图片通过requests
抓取下来再上传到七牛云,以达到自动替换的效果。这只是最简单的做法,当然,最好的做法还是在前端监听粘贴事件,实时上传。Django-MarkdownX文本编辑器使用
目前,
Django-CKeditor
暂时还不支持markdown
,所以只能用Django-Markdownx
来代替,要兼容两者就只能用两个字段来存储了。引入步骤:安装依赖,并且将
markdownx
加入INSTALLED_APPS
中1
pip install django-markdownx
添加路由
vim app/urls.py
:1
2
3
4urlpatterns = [
[...]
url(r'^markdownx/', include('markdownx.urls')),
]字段定义
1
2class Post(models.Model):
content = MarkdownxField()自定义tag,
vim app/templatetags/base.py
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
27
28
29
30
31
32
33
34
35
36
37
38
39import markdown
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
def custom_markdown(value):
return mark_safe(
markdown.markdown(
value,
extensions=[
"markdown.extensions.extra",
"markdown.extensions.toc",
"markdown.extensions.sane_lists",
"markdown.extensions.nl2br",
"markdown.extensions.codehilite",
],
safe_mode=True,
enable_attributes=False,
)
)
def custom_markdown_unsafe(value):
return mark_safe(
markdown.markdown(
value,
extensions=[
"markdown.extensions.extra",
"markdown.extensions.toc",
"markdown.extensions.sane_lists",
"markdown.extensions.nl2br",
"markdown.extensions.codehilite",
],
safe_mode=False,
enable_attributes=False,
)
)添加相关配置到配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17MARKDOWNX_MARKDOWNIFY_FUNCTION = 'markdownx.utils.markdownify'
MARKDOWNX_MARKDOWN_EXTENSION_CONFIGS = {}
MARKDOWNX_URLS_PATH = '/markdownx/markdownify/'
MARKDOWNX_UPLOAD_URLS_PATH = '/markdownx/upload/'
MARKDOWNX_MEDIA_PATH = 'media/markdownx/img'
MARKDOWNX_UPLOAD_MAX_SIZE = 5 * 1024 * 1024
MARKDOWNX_UPLOAD_CONTENT_TYPES = ['image/jpeg', 'image/png', 'image/svg+xml']
MARKDOWNX_IMAGE_MAX_SIZE = {'size': (800, 500), 'quality': 100,}
MARKDOWNX_EDITOR_RESIZABLE = True
MARKDOWNX_MARKDOWN_EXTENSIONS = [
'markdown.extensions.fenced_code',
'markdown.extensions.codehilite',
'markdown.extensions.smarty',
'markdown.extensions.extra',
'markdown.extensions.tables',
'markdown.extensions.sane_lists',
]
前端模板这样渲染
1
2
3<div>
{{ content | custom_markdown }}
</div>左右分割显示
默认的编辑器样式是上下分割,上面编辑,下面实时显示,但是对于长文本十分不方便,如果要进行左右分割,需要这样做:
引入
bootstrap
依赖,并且将bootstrap3
加入INSTALLED_APPS
中1
pip install django-bootstrap3
覆写原本的编辑框,
app/templates/markdownx/widget2.html
:1
2
3
4
5
6
7
8
9
10
11
12{% load bootstrap3 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
<div class="markdownx row">
<div class="col-md-6">
{% include 'django/forms/widgets/textarea.html' %}
</div>
<div class="col-md-1"></div>
<div class="col-md-5">
<div class="markdownx-preview"></div>
</div>
</div>添加admin管理:
1
2
3
4class PostAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': AdminMarkdownxWidget},
}
TroubleShooting
Python crashes after trying to visit admin page with exit code 245: 每次进入admin页面程序就崩溃,可以尝试更新
python
版本或者更新django
版本,我3.7.0b2
遇到过这个问题,升级Python
得以解决隐藏或修改Admin中的第三方APP管理: 随便找个自己的
app
,在admin.py
中取消该app
的注册:1
2
3
4
5
6admin.site.unregister(ThirdModel)
#而如果要修改第三方的管理类,可以这样做,重新注册一个新的类
class NewThirdModel(ThirdModel):
pass
admin.site.register(ThirdModel, NewThirdModel)