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. underscore的bind和bindAll方法

    bind方法和bindAll方法都是用来设定函数的this值的,区别是调用方式不同. var xiaoming = { say:function(){ console.log('I am xiaomi ...

  2. Linux内存 性能调优

    内存是影响Linux性能的主要因素之一,内存资源的充足与否直接影响应用系统的使用性能. free命令:监控Linux内存使用状况. 由上图可知,空闲内存是free+buffers+cached=155 ...

  3. Install the Active Directory Administration Tools on Windows Server

    安装 Active Directory 管理工具 To manage your directory from an EC2 Windows instance, you need to install ...

  4. Binding and styling text to a RichTextBox in WPF

    http://www.codeproject.com/Articles/137209/Binding-and-styling-text-to-a-RichTextBox-in-WPF The Rich ...

  5. java replace方法

    一:前言 replace自己老是忘记参数是那个替换那个,自己就把replace方法全部给弄了一遍 二:内容 package org.replaceDemo; public class ReplaceD ...

  6. JAVA 成员访问权限修饰符

    修饰符         类内部     package内         子类         其他 public             允许         允许                 ...

  7. [POJ1286&POJ2154&POJ2409]Polya定理

    Polya定理 L=1/|G|*(m^c(p1)+m^c(p2)+...+m^c(pk)) G为置换群大小 m为颜色数量 c(pi)表示第i个置换的循环节数 如置换(123)(45)(6)其循环节数为 ...

  8. [ CodeVS冲杯之路 ] P2456

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木 ...

  9. Runtime类 调用windows程序。

    import java.io.*; public class webcyz { /** * @param args */ public static void main(String[] args) ...

  10. Django-models,继承AbstractUser类

    1.UserInfo类继承了Django模型自带的User类,需要导入AbstractUser   2.然后在settings.py中配置