Django Admin 后台管理系统及富文本编辑器Django-Ckeditor的使用

栏目: Python · 发布时间: 5年前

内容简介:Django自带了强大的名为为了管理具体的某张表,我们需要在app下的

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 参数

  • 修改超级管理员密码可以这样做:

    # 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

from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from myapp.models import PostModel

class PostAdmin(admin.ModelAdmin):
  list_display = ('id', 'name', 'created_at')	# 定义后台列表显示时需要显示哪些字段
  list_per_page = 50		# 定义后台列表显示时每页显示数量
  list_filter = ('id', 'name', )	# 定义后台列表显示时能够筛选的字段(会列出所有的可筛选值)
  search_fields = ('username', 'email',)	# 指定能搜索哪些字段
  list_editable = ['field']	# 定义可以直接在列表页进行更改的字段
  fx_fields = ('user_id', )	# 定义列表页显示的外键字段,会直接显示关联的值
  filter_horizontal = ('posts')	# 显示多对多字段
  readonly_fields = ('username')	# 设置只读字段,不允许更改
  ordering = ('-created_at', )	# 定义列表显示的顺序,负号表示降序
  fieldsets = (		# 对字段进行分类设置,前端会分开显示
  	(None, {'fields': ('username', 'password', )}),
  	('Personal info', {'fields': ('firstname', )}),
    ('Permissions', {'fields': ('groups', )}),
  )
  add_fieldsets = (	# 定义添加数据时需要填写哪些字段
    (None, {'classes': ('wide',), 'fields': ('name', 'content' )}),
    )
  
  def save_model(self, request, obj, form, change):
    """定义保存对象的方式,可以在这里做一些其他的事情。这个方法不需要返回任何东西,如果要捕获其中的错误或者重定向,最好是设置一个对象字段,然后在response_change或response_add中进行处理"""
    self.has_error = True
    self.message_user(request, "友好地给用户显示错误信息", level=logging.ERROR)
    super().save_model(request, obj, form, change)
    return
  
  def response_change(self, request, obj):
    """改变记录之后的响应操作,可以捕获错误并返回应该返回的消息"""
    if self.has_error:
      return HttpResponseRedirect(request.path)
    else:
      return super().response_chage(request, obj)
  
  def respopnse_add(self, request, obj, post_url_continue=None):
    """添加记录之后的响应操作"""
    return super().response_add(request, obj, post_url_continue)
  
admin.site.register(PostModel, PostAdmin)	# 注册管理模型
admin.site.site_header = '后台页面的header'
admin.site.site_title = '后台的title'

自定义admin管理数据创建及修改表单

class MyModelCreationForm(forms.ModelForm):
    """自定义创建表单"""
    field_name = forms.CharField(label='field_name')
    
    class Meta:
        model = MyModel
        fields = ('email', 'field2')
        exclude = ('created_at', )	# 排除某些字段不用在后台管理

class MyModelChangeForm(forms.ModelForm):
    """自定义修改表单"""
    password = ReadOnlyPasswordHashField(label= ("Password"), help_text= ("Raw passwords are not stored, so there is no way to see this user's password, but you can change the password using <a href=\"../password/\">this form</a>."))	# 如果要修改密码字段,我们需要这样提示
    def clean_password(self):
        return self.initial["password"]

class UserAdmin(BaseUserAdmin):	# 用户管理需要继承单独的Admin
    form = UserChangeForm				# 指定修改表单
    add_form = UserCreationForm	# 指定创建表单

Django-CKeditor富文本编辑使用

django-ckeditor 扩展,使用简单,前端也漂亮

  1. 安装 pip install django-ckeditor ,如果要在富文本里添加图片还需要 pip install pillow

  2. 注册应用, INSTALLED_APPS 里添加 ckeditor ,图片还需要添加 ckeditor_uploader

  3. 如果要使用自定义的文件存储,例如七牛云存储,可以参考这篇文章进行设置

  4. 如果要处理图片,还需要在 settings.py 里面添加如下设置:

    # 前面两个可能已经设置了,是存放用户上传文件的地方
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
     
    CKEDITOR_UPLOAD_PATH = 'upload/'
    
    CKEDITOR_CONFIGS = {	# 添加个性化的配置
        'default': {
            'image_previewText':' ',	# 替换图片显示区域那一串搞不懂的字符串
            'tabSpaces': 4,
        }
    }
    

    另外还需要添加一个路由用于上传请求

    from django.conf.urls.static import static
    
    urlpatterns = [
    	...
        path('ckeditor/', include('ckeditor_uploader.urls')),
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    模型里面对应的字段设置

    from ckeditor.fields import RichTextField
    
    class Post(models.Model):
        content = RichTextField()
        content2 = RichTextUploadingField()	# 带有上传图片功能的富文本编辑
    

Django-CKeditor 目前还不支持粘贴的时候自动上传图片,我的做法是在对象的 Adminsave_model 方法里面对没有转换为内链的外部链接图片通过 requests 抓取下来再上传到七牛云,以达到自动替换的效果。这只是最简单的做法,当然,最好的做法还是在前端监听粘贴事件,实时上传。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails, Third Edition

Agile Web Development with Rails, Third Edition

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95

Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具