Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
对不同应用的管理,可以将用户分为不同类别的组,这样就能便于不同应用的 model 的数据管理。
代码语言:javascript复制request.user.has_perms('<app_name>.<codename>')
判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename。判断user.permissions下有没有这个权限:有, 返回True;没有, 判断所属组下有没有这个权限。
代码语言:javascript复制content_type = ContentType.objects.get_for_model(model)
permissions = Permission.objects.filter(content_type=content_type)
① 自定义权限限定装饰器
代码语言:javascript复制from django.contrib.auth.models import Permission, ContentType
from django.http import Http404
如果拥有,那么就可以进入到指定的视图函数中,如果不拥有,那么就会报一个404错误。
代码语言:javascript复制def permission_required(model):
def decorator(viewfunc):
@wraps(viewfunc)
def _wrapper(request, *args, **kwargs):
content_type = ContentType.objects.get_for_model(model)
permissions = Permission.objects.filter(content_type=content_type)
codenames = [content_type.app_label "." permission.codename for permission in permissions]
# result = request.user.has_perms(permissions)
# result = request.user.has_perms(['news.add_news', 'news.change_news', 'news.delete_news'])
# has_perms只能采用字符串的形式判断
# 字符串的形式为 app_label.codename
result = request.user.has_perms(codenames)
if result:
return viewfunc(request, *args, **kwargs)
else:
raise Http404()
return _wrapper
return decorator
② 轮播图管理页
代码语言:javascript复制@permission_required(Banner)
def banners(request):
return render(request, 'cms/banners.html')
③ 轮播图列表
代码语言:javascript复制@permission_required(Banner)
def banner_list(request):
# values 返回的还是QuerySet
# 只不过在QuerySet中, 有的不是模型了,而是字典
banners = list(Banner.objects.all().values())
return restful.result(data={"banners": banners })
④ 添加轮播图
代码语言:javascript复制@permission_required(Banner)
def add_banner(request):
form = AddBannerForm(request.POST)
if form.is_valid():
image_url = form.cleaned_data.get('image_url')
link_to = form.cleaned_data.get('link_to')
priority = form.cleaned_data.get('priority')
banner = Banner.objects.create(image_url=image_url, link_to=link_to, priority=priority)
return restful.result(data={"banner_id": banner.pk})
else:
return restful.params_error(message=form.get_error())
⑤ 删除轮播图
代码语言:javascript复制@permission_required(Banner)
def delete_banner(request):
banner_id = request.POST.get('banner_id')
Banner.objects.filter(pk=banner_id).delete()
return restful.ok()
⑥ 修改轮播图
代码语言:javascript复制@permission_required(Banner)
def edit_banner(request):
form = EditBannerForm(request.POST)
if form.is_valid():
pk = form.cleaned_data.get('pk')
image_url = form.cleaned_data.get('image_url')
link_to = form.cleaned_data.get('link_to')
priority = form.cleaned_data.get('priority')
Banner.objects.filter(pk=pk).update(image_url=image_url, link_to=link_to, priority=priority)
return restful.ok()
else:
return restful.params_error(message=form.get_error())