我的问题与View permissions in Django不同,因为该问题解释了如何处理Django 2.1及更高版本中的问题,该问题在我使用Django 1.1时具有“查看”权限的概念。哪个没有。
Django 1.11
我有一个网上论坛用户,他们应该只能对网站上的所有内容进行只读访问。对字段,模型和实际数据没有限制,只有它们可以做什么(只读)。我知道可能的实现建议“逐字段”(或“将所有字段设为只读”)和“逐模型”解决方案。我想知道是否有一种方法可以使它更清洁,无论是在用户组级别还是至少在用户级别。
到目前为止,我的views.py是默认设置:
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
"""View function for home page of site."""
# Render the HTML template index.html with the data in the context variable
return render(request, 'home.html')
理想情况下,我希望能够使用固定装置来做到这一点。 当前在灯具中,我的分组定义如下:
{
"model": "auth.group",
"fields": {
"name": "some_group",
"permissions": [
[
"add_somemodel",
"myproject",
"somemodel"
],
[
"change_somemodel",
"myproject",
"somemodel"
],
[
"delete_somemodel",
"myproject",
"somemodel"
]
]
}
}
在Django 2.2中,我可以做到
{
"model": "auth.group",
"fields": {
"name": "some_group",
"permissions": [
[
"view_somemodel",
"myproject",
"somemodel"
]
]
}
}
但是在Django 1.11中,我只有“添加”,“删除”和“更改”-没有“查看”选项(根据文档enter link description here)。那么,有没有一种方法可以创建一个夹具,该夹具创建一个只对所有内容具有读取权限的组?
答案 0 :(得分:0)
在您看来,您需要这样的内容(请注意,如果您属于适当的访问权限组,这是如何查看帖子的示例)
def post_detail(request, slug=None):
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
instance = get_object_or_404(Post, slug=slug)
share_string = quote_plus(instance.content)
context = {
"title": instance.title,
"instance": instance,
"share_string": share_string,
}
return render(request, "post_detail.html", context)
请注意:
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
以下是一些可帮助您的文档的链接:
All attributes to django.contrib.auth
编辑: 我现在看到了您的代码,因此您想要实现的目标可以像这样
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
"""View function for home page of site."""
# With that way although a user might be logged in
# but the user might not have access to see the page
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
# Render the HTML template index.html with the data in the context variable
return render(request, 'home.html')
这样,用户可以登录,但是如果不是工作人员或超级用户,则希望访问该页面。
答案 1 :(得分:0)
谢谢大家的回应。我没有弄清楚使用Django 1.11在数据库中仅使用user / group / permissions配置的方式,也许它不存在。这就是我最终得到的结果(非常类似于我4个小时前开始研究时对SO提出的第一个建议,只需很少的代码更改)
[
{
"model": "auth.group",
"fields": {
"name": "<my_new_group>",
"permissions": [
[
"change_<somemodel1>",
"<myproject>",
"<somemodel1>"
],
[
"change_<somemodel2>",
"<myproject>",
"<somemodel2>"
]
]
}
,
{
"model": "auth.user",
"fields": {
"password": "<my_password>",
"last_login": null,
"is_superuser": false,
"username": "<my_username>",
"first_name": "",
"last_name": "",
"email": "",
"is_staff": true,
"is_active": true,
"date_joined": "2019-04-01T14:40:30.249Z",
"groups": [
[
"<my_new_group>"
]
],
"user_permissions": []
}
}
],
这处理了第一部分:现在,当我以该用户身份登录时,对于我的用户的任何型号,我在任何地方都没有“添加新..”或“删除”按钮。
admin.py
中,在其自定义def changeform_view
中,我添加了:if request.user.groups.filter(name='<my_new_group>'):
extra_context['show_save_and_add_another'] = False
extra_context['show_save_and_continue'] = False
extra_context['show_save'] = False
这使所有型号的那三个“保存”按钮消失,并且所有字段均为只读。现在,这个新用户无法为任何模型添加,删除或编辑任何内容,但是他们可以按照我的意愿看到所有内容。
就像在新版Django中一样,从2.1开始,这可以做得更好。