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>