1、编辑usercenter-message.html继承usercenter-base.html

2、编辑users.views.py

...
from operation.models import UserMessage class MyMessageView(LoginRequiredMixin, View):
def get(self, request):
messages = UserMessage.objects.filter(user=request.user.id)
return render(request, 'usercenter-message.html', {
'messages': messages,
})

3、编辑users.urls.py

...
from .views import MyFavOrgView, MyFavTeacherView, MyFavCourseView, MyMessageView urlpatterns = [
...
url(r'my_message/$', MyMessageView.as_view(), name='my_message'),
]

4、前端数据动态展示,编辑usercenter-message.html

5、修改usercenter-base.html导航链接

到此,可以在xadmin后台给用户添加消息。前端就能展示出来了...

消息分页

编辑users.view.spy

...
from pure_pagination import Paginator, PageNotAnInteger class MyMessageView(LoginRequiredMixin, View):
def get(self, request):
messages = UserMessage.objects.filter(user=request.user.id) # 分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(messages, 5, request=request)
my_messages = p.page(page) return render(request, 'usercenter-message.html', {
'messages': my_messages,
})

编辑usercenter-message.html

导航栏样式

思路:每个页面传递一个参数到前端,前端根据参数值判断样式。

顶部显示未读消息数

我们可以在userprofile表里面定义方法来获取未读消息数

class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name='昵称', default='')
birthday = models.DateField(verbose_name='生日', null=True, blank=True)
gender = models.CharField(max_length=6, choices=(('male', '男'), ('female', '女')), default='female')
address = models.CharField(max_length=100, default='')
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to='image/%Y/%m', default='image/default.png', max_length=100) class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name def get_message_nums(self):
from operation.models import UserMessage
return UserMessage.objects.filter(user=self.id, has_read=False).count() def __str__(self):
return self.username

编辑usercenter-base.html, 并且把这段代码复制到base.html和org_base.html

当我们点击喇叭图标进入消息页面,则所有消息变为已读,编辑users.views.py

当新用户注册后,会系统发送的欢迎信息,编辑注册的view

class RegisterView(View):
def get(self, request):
Register_form = RegisterForm()
return render(request, 'register.html', {'register_form': Register_form}) def post(self, request):
Register_form = RegisterForm(request.POST)
if Register_form.is_valid():
user_name = request.POST.get('email', '')
pass_word = request.POST.get('password', '')
user_profile = UserProfile()
if not UserProfile.objects.filter(email=user_name):
user_profile.email = user_name
user_profile.username = user_name
user_profile.password = make_password(pass_word)
user_profile.is_active = False
user_profile.save() # 欢迎消息
user_message = UserMessage()
user_message.user = user_profile.id
user_message.message = '您好:{},欢迎注册慕学网,祝您学习愉快'.format(user_profile.username)
user_message.save() sendEmail(user_name, 'register')
return render(request, 'login.html')
else:
return render(request, 'register.html', {'register_form':Register_form, 'msg':'该邮箱已被注册'})
else:
return render(request, 'register.html', {'register_form': Register_form})

33、Django实战第33天:我的消息的更多相关文章

  1. The authenticity of host '172.16.33.53 (172.16.33.53)' can't be established的问题(日志六)

    用ssh登录一个机器(换过ip地址)会出现如下错误 weiguohui@weiguohui1-virtual-machine:~/.ssh$ ssh 172.16.33.53The authentic ...

  2. 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)

    <跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...

  3. 33.Django ModelForm

    ModelForm 1.ModeForm简单验证 from django.db import models # Create your models here. class UserInfo(mode ...

  4. Django教程:[33]从数据库生成模型

    在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...

  5. 33、Flask实战第33天:sweetalert提示框

    这节我们继续优化,接收到返回值,我们在前端做一些处理,如:密码修改成功,弹出一个成功的提示框.这个提示框我们采用sweetalert 其中xtalert.js是对上面两个文件的一个封装,使得我们用sw ...

  6. 前端每日实战:33# 视频演示如何用纯 CSS 创作牛奶文字变换效果

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MGNWOm 可交互视频教程 此视频 ...

  7. Django笔记&教程 3-3 模板常用语法

    Django 自学笔记兼学习教程第3章第3节--模板常用语法 点击查看教程总目录 本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/ ...

  8. Flutter移动电商实战 --(33)列表页_子类和商品列表交互效果

    主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口说明: https://jspang. ...

  9. 区块链入门到实战(33)之Solidity – 数据类型

    在用任何语言编写程序时,都需要使用变量来存储各种信息.变量是内存空间的名称,变量有不同类型,例如整型.字符串类型等等.操作系统根据变量的数据类型分配内存. Solidity中,变量类型有以下几大类: ...

随机推荐

  1. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  2. 洛谷P1273 有线电视网 (树上分组背包)

    洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...

  3. netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例

    网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/2 ...

  4. 51nod 1076 2条不相交的路径

    给出一个无向图G的顶点V和边E.进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径.(两条路径不经过相同的边)   (注,无向图中不存在重边,也就是说确定起点和终点 ...

  5. ubuntu安装mysqlclient

    安装mysql: sudo apt-get install mysql-server mysql-client 然后mysql -V查看mysql是否安装成功 sudo apt-get install ...

  6. JMeter之定时器的作用域

    定时器的作用域 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执行 ...

  7. 出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int

    出现这种错误的原因,是因为函数没有写返回值.是在VC6.0的工程转为高版本(VS2010)的时候经常出现的; #include <stdio.h> main() { printf(&quo ...

  8. PHP定时执行

    参考一 test.bat D:\myamp\php\php.exe -q D:\myamp\Apache\htdocs\dingshi.php dingshi.php <?php ignore_ ...

  9. vue + vue-router + vue-resource 基于vue-cli脚手架 --->笔记

    ps: 基于Vue2.0 npm的vue-cli脚手架 在vue-router中路由路径的简写代码: 点击打开项目 > build > webpack.base.conf.js 找到web ...

  10. 生产环境安装centos时的磁盘规划

    一般来说,分区要按照公司领导的要求来执行.但是如果没有要求,一般按照下面的方法进行磁盘规划. /boot分区200M: swap分区分内存的2倍.如果内存大于等于8G,那么swap分8G即可: /分区 ...