django的相关插件

media的使用

  • pip install pillow 安装pillow插件

  • settings.py配置

    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR,'media')
    
  • 在项目文件夹下新建一个media文件夹 ---》img文件夹 ---》avatar文件夹,放头像图片

  • 项目同名文件夹下的urls.py

    from django.views.static import serve
    from django.conf import settings
    urlpatterns = [
        url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
    ]
    
  • models.py给UserInfo表新增添加头像的字段

    from django.db import models
    # 用户信息表
    class UserInfo(models.Model):
        avatar = models.ImageField(upload_to='img/avatar', default='img/avatar/1.jpg')
    
  • views.py

    # 注册函数register
    提交了post请求后,需要传request.FILES上传的文件
    def register(request):
        reg_obj = RegForm()
        if request.method == 'POST':
            reg_obj = RegForm(request.POST, request.FILES)  # 通过request.FILES获取上传的文件
            print(request.FILES)
            if reg_obj.is_valid():
                reg_obj.save()
                return redirect('login')
        return render(request, 'register.html', {'reg_obj': reg_obj})
    
  • 中间件配置当前用户对象

    • views.py

      # login函数
      def login(request):
          if request.method == 'POST':
              username = request.POST.get('username')
              password = request.POST.get('password')
              ssl = encryption(password)
              user_obj = models.UserInfo.objects.filter(username=username, password=ssl).first()
              if user_obj:
                  request.session['is_login'] = True
                  request.session['username'] = user_obj.username
                  # request.session['pk'] = user_obj.pk  # 通过session设置pk值
                  url = request.GET.get('url')
                  if url:
                      return redirect(url)
                  return redirect('index')
              else:
                  error = '用户名或者密码错误'
          return render(request, 'login.html', locals())
      # my_middleware.py
      from django.utils.deprecation import MiddlewareMixin
      from django.shortcuts import redirect, reverse
      from istudy import settings
      import re
      from app01 import models
      class LandingCheck(MiddlewareMixin):
          def process_request(self, request):
              url = request.path_info
              is_login = request.session.get('is_login')
              if is_login:
                  # obj = models.UserInfo.objects.filter(pk=request.session['pk']).first()
                  # request.user_obj = obj  # 不能给request.user赋值
                  return
              for i in settings.WHITE_LIST:
                  if re.match(i, url):
                      return
      
              return redirect(f'{reverse("login")}?url={url}')
      # index页面
      通过request.user_obj.avatar.url 可以获取到当前对象对应的头像
      <img width="27px" src="{{ request.user_obj.avatar.url }}"
          style="margin-right: 5px;border-radius :14px ">
      
  • form表单中修改choice参数,(确保作者是当前登录的用户,添加和编辑文章详情,作者只显示当前登录的用户对象)

    • views.py

      # 文章添加,通过中间件设置的用户obj对象获取到对应的文章对象
      def article_add(request):
          obj = models.Article(author=request.user_obj)
          form_obj = ArticleForm(instance=obj)
          if request.method == 'POST':
              form_obj = ArticleForm(request.POST,instance=obj)
      # 文章编辑,通过传过来的pk获取到对应的文章对象
      def article_edit(request,pk):
          obj = models.Article.objects.filter(pk=pk).first()
          form_obj = ArticleForm(instance=obj)
          if request.method == 'POST':
              form_obj = ArticleForm(request.POST,instance=obj)
      
    • forms.py

      定义一个__init__
      class ArticleForm(forms.FormModel):
          def __init__(self,*args,**kwargs):
              super().__init(*args,**kwargs)
              
              for field in self.fields.values():
                  field.widget.attrs['class'] = 'form-control'
      		self.fields['author'].choices = [(self.instance.author_id,
                                                self.instance.author.username)]
      

富文本编辑器

  • pip install django-ckeditor 下载富文本编辑器插件

  • 配置settings.py文件

    # 将ckeditor,ckeditor_uploader添加到自己项目的INSTALLED_APPS设置中。
    INSTALLED_APPS = [
        'ckeditor',
        'ckeditor_uploader',
    ]
    # 将CKEDITOR_UPLOAD_PATH设置添加到项目的settings.py文件中,
    # 默认情况下,Django使用文件系统存储后端(它将使用您的MEDIA_ROOT和MEDIA_URL)
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    CKEDITOR_UPLOAD_PATH = 'ckeditor/'
    # 如果您不使用其他后端,则必须具有MEDIA_ROOT中CKEDITOR_UPLOAD_PATH路径的写权限,即:
    CKEDITOR_UPLOAD_PATH =“上传/”
    
  • 自定义ckeditor_uploader下的urls.py

    app01下的ckeditor_urls.py

    # 复制ckeditor_uploader下的urls.py到自己项目下的app01文件下,改名为ckeditor_urls.py,方便查找
    from __future__ import absolute_import
    
    from django.conf.urls import url
    from django.contrib.admin.views.decorators import staff_member_required
    from django.views.decorators.cache import never_cache
    
    from ckeditor_uploader import views
    
    urlpatterns = [
        url(r'^upload/', views.upload, name='ckeditor_upload'),
        url(r'^browse/', never_cache(views.browse), name='ckeditor_browse'),
    ]
    

    项目文件夹下的urls.py

    # 放ckeditor_urls.py的路径
    urlpatterns = [
        url(r'^ckeditor/', include('app01.ckeditor_urls')),
    ]
    

    models.py

    # 给文章表使用RichTextUploadingField类
    from ckeditor_uploader.fields import RichTextUploadingField
    
    # 文章内容表
    class ArticleDetail(models.Model):
        """
        文章的详细内容
        """
        content = RichTextUploadingField(verbose_name='文章内容')
    

    forms.py

    # 定义类文章详情类继承forms.ModelForm
    class ArticleDetailForm(forms.ModelForm):
        class Meta:
            model = models.ArticleDetail
            fields = "__all__"
    

    views.py

    # 文章添加
    def article_add(request):
        obj = models.Article(author=request.user_obj)
        form_obj = ArticleForm(instance=obj)
        # article_detail_form_obj = ArticleDetailForm() 实例化ArticleDetailForm对象
        error = ''
        if request.method == 'POST':
            form_obj = ArticleForm(request.POST, instance=obj)
            article_detail_form_obj = ArticleDetailForm(request.POST)
            if form_obj.is_valid() and article_detail_form_obj.is_valid(): # 进行校验
                detail_obj = article_detail_form_obj.save() # 对获取到的文章内容进行保存
                form_obj.instance.detail_id = detail_obj.pk
                form_obj.save()
                return redirect('article')
    
        return render(request, 'article_add.html', {'form_obj': form_obj, 'error': error,
                                        'article_detail_form_obj':article_detail_form_obj})
    
    html页面
    # 通过article_detail_form_obj.content显示文本框
    {{ article_detail_form_obj.content }}
    # 导入js文件
    {% load static %}
    <script type="text/javascript" src="{% static "ckeditor/ckeditor-init.js" %}"></script>
    <script type="text/javascript" src="{% static "ckeditor/ckeditor/ckeditor.js" %}"></script>
    
    # 文章的编辑
    def article_edit(request, pk):
        article_obj = models.Article.objects.filter(pk=pk).first()
        form_obj = ArticleForm(instance=article_obj)
        
        article_detail_form_obj = ArticleDetailForm(instance=article_obj.detail)
        # 实例化ArticleDetailForm对象,并把当前文章对应的文章内容对象传给instance
        
        if request.method == 'POST':
            form_obj = ArticleForm(request.POST, instance=article_obj)
            article_detail_form_obj = ArticleDetailForm(request.POST, 																	instance=article_obj.detail)
            if form_obj.is_valid() and article_detail_form_obj.is_valid(): # 进行校验
                article_detail_form_obj.save() # 对获取到的文章内容进行保存
                form_obj.save()
                return redirect('article')
        return render(request, 'article_edit.html',
                      {'form_obj': form_obj, 'article_detail_form_obj': article_detail_form_obj})
    
    # html页面
    # 通过article_detail_form_obj.content显示文本框
    {{ article_detail_form_obj.content }}
    # 导入js文件
    {% load static %}
    <script type="text/javascript" src="{% static "ckeditor/ckeditor-init.js" %}"></script>
    <script type="text/javascript" src="{% static "ckeditor/ckeditor/ckeditor.js" %}"></script>
    
posted @ 2020-08-26 16:58  左晓龙  阅读(121)  评论(0编辑  收藏  举报