(1)静态文件
新建statics目录(存放css/fonts/imgs/js/plugins)
settings配置
STATIC_URL = '/static/'STATICFILES_DIRS = ( os.path.join(base_DIR, 'statics'), )
(2)模板文件
templates下新建crm目录,把Dashboard Template for Bootstrap.html放到里面,命名为dashboard.html
{#templates/crm/dashboard.html#}{% extends 'index.html' %}templates下新建base.html(主要存放css和js)
{#templates/base.html#}
{% load staticfiles %}
{# #} PerfectCRM
{% block body %}
{% endblock %}
base.html此时目录
image
(3)配置url
PerfectCRM/urls.py
# PerfectCRM/urls.pyfrom django.conf.urls import url,includefrom django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^crm/', include('crm.urls')),
]crm/urls.py
# crm/urls.pyfrom django.conf.urls import url,includefrom crm import views urlpatterns = [ url(r'^$', views.dashboard), ]
现在访问http://127.0.0.1:8000/crm/,就可以显示正常页面了
(4)index.html修改
删除search+右上角留一个就好
左侧project改成block
Dashboard改成h2,删除class “row placeholders”里面的内容
删除class “sub-header“”里面的内容
左边ul只留一个就好
图片.png
index.html
{#templates/index.html#}
{% extends 'base.html' %}
{% block body %}
- Overview (current)
- Reports
- Analytics
- Export
Dashboard {% endblock %} index.py
(5)动态菜单生成
销售,学生,讲师访问页面时。显示的应该是对应角色的菜单,所以需要动态生成菜单
crm/models.py
添加Menus
class Menus(models.Model):
'''动态菜单'''
name = models.CharField(max_length=64) #绝对url和动态url
url_type_choices = ((0,'absolute'),(1,'dynamic'))
url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
url_name = models.CharField(max_length=128) def __str__(self):
return self.name class meta:
unique_together = ('name','url_name')在Role中关联Menus
class Role(models.Model):
'''角色表'''
name = models.CharField(max_length=64,unique=True) #不能重
#一个角色可以访问多个菜单,一个菜单可以被多个角色访问
menus = models.ManyToManyField('Menus',blank=True,verbose_name='动态菜单') def __str__(self):
return self.name生成表,然后注册到后台
crm/admin.py
from django.contrib import adminfrom crm import modelsadmin.site.register(models.Role)admin.site.register(models.CustomerInfo)admin.site.register(models.Student)admin.site.register(models.CustomerFollowUp)admin.site.register(models.Course)admin.site.register(models.ClassList)admin.site.register(models.CourseRecord)admin.site.register(models.StudyRecord)admin.site.register(models.Branch)admin.site.register(models.Menus)admin.site.register(models.UserProfile)
开始创建菜单,角色,用户之前
首先修改UserProfile的user字段为OneToOneField
image
然后还要有登录界面
登录页面开发`
(1)templates/login.html
{#templates/login.html#}
{% extends 'index.html' %}
{% load staticfiles %}
{% block extra-css %} {% endblock %}
{% block body %}
{% endblock %}(2)statics/css/signin.css
body { padding-top: 40px; padding-bottom: 40px; background-color: #eee;
}.form-signin { max-width: 330px; padding: 15px; margin: 0 auto;
}.form-signin .form-signin-heading,.form-signin .checkbox { margin-bottom: 10px;
}.form-signin .checkbox { font-weight: normal;
}.form-signin .form-control { position: relative; height: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 10px; font-size: 16px;
}.form-signin .form-control:focus { z-index: 2;
}.form-signin input[type="email"] { margin-bottom: -1px; border-bottom-right-radius: 0; border-bottom-left-radius: 0;
}.form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0;
}(3)PerfectCRM/urls.py
url(r'^login/', views.acc_login),
(4)PerfectCRM/views.py
# PerfectCRM/views.pyfrom django.shortcuts import renderdef acc_login(request): return render(request,'login.html')
访问:http://127.0.0.1:8000/login/
image
(5)登陆验证
PerfectCRM/views.py
# PerfectCRM/views.pyfrom django.shortcuts import render,redirectfrom django.contrib.auth import authenticate,logindef acc_login(request):
if request.method == 'POST':
username = request.POST.get('username',None)
password = request.POST.get('password',None) #user是一个对象
#验证
user = authenticate(username=username,password=password) if user: #登录(已生成session)
login(request,user) return redirect('/crm/') return render(request,'login.html')index.html中显示登录的用户名{{request.user}}
(6)登出
Bootstrap3/起步 -->> https://v3.bootcss.com/examples/navbar-static-top/#
image
image
右键-->>copy-->>copy element,放到index.html里面
-
{{ request.user }}
- 个人信息
- Logout
PerfectCRM/urls.py
url(r'^logout/', views.acc_logout,name='logout'),
PerfectCRM/views.py
def acc_logout(request):
logout(request) return redirect("/login/")现在可以点“logout”跳到login登录界面
image
image
-
{{ request.user }}
- 个人信息
- Logout
(8)添加错误信息
PerfectCRM/views.py
def acc_login(request):
error_msg = ''
if request.method == 'POST':
username = request.POST.get('username',None)
password = request.POST.get('password',None) #user是一个对象
#验证
user = authenticate(username=username,password=password) if user: #登录(已生成session)
login(request, user) return redirect('/crm/') else:
error_msg = '用户名或密码错误!'
return render(request,'login.html',{'error_msg':error_msg})login.html渲染
image
(9)有的页面只有登录后才能访问
crm/views.py
# crm/views.pyfrom django.shortcuts import renderfrom django.contrib.auth.decorators import login_required@login_requireddef dashboard(request): return render(request,'crm/dashboard.html')
settings中设置如果没登录访问跳转的地方
settings.py
#登录才能访问的页面,如果没登录直接跳转到login界面LOGIN_URL = '/login/'
现在没登录状态访问:http://127.0.0.1:8000/crm/
跳到了login界面
image
PerfectCRM/views.py
修改acc_login的redirect
#如果有next值就获取next值,没有就跳转到首页
return redirect(request.GET.get('next','/'))没登录状态访问/crm/,跳到login,登录后(获取next=/crm/)跳到/crm/页面
动态菜单生成首先获取登录的用户(User)
通过User反向查找到UsrProfile
然后通过UserProfile找到用户关联的所有角色
最后通过角色循环遍历出用户所有的菜单
image
image
index.html
- Overview (current)
- Reports
- Analytics
- Export {% for role in request.user.userprofile.role.select_related %} {% for menu in role.menus.select_related %}
- {{ menu.name }} {% endfor %} {% endfor %}
如果是静态url直接获取,动态url就{% url menu.url_name%}获取
OneToOneField和ForeignKey反向获取
OneToOneField反向查,直接request.user.userprofile 后面跟反向的表明(小写)就可以
如果是FK,直接request.user.userprofile_set 后面跟反向的表明(小写)+“_set” 就可以
request.user.userprofile.role.select_related等价于request.user.userprofile.role.all
下面开始添加菜单,角色,关联用户
(1)添加菜单
image
url中name一致
# crm/urls.pyfrom django.conf.urls import url,includefrom crm import views urlpatterns = [ url(r'^$', views.dashboard,name='sales_dashboard'), ]
再添加两个菜单(静态url)
image
image
(2)添加角色
添加sales和students两个角色
image
image
(3)关联用户
image
image
(4)动态菜单查看
现在用不同的角色登录后,就可以实现动态菜单功能了
用derek账户登录(sales的菜单)
image
用kebi账户登录(students菜单)
作者:Zhang_derek
链接:https://www.jianshu.com/p/5a687e75f4bf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。



