Здесь я пытаюсь дать сотрудникам некоторые определенные разрешения. Я пробовал вот так. Этот код сохраняет все проверенные разрешения в таблице базы данных auth_user_user_permissions
, а также отображает добавленные разрешения для конкретного пользователя в шаблоне, но пользователиЯ не могу использовать эти разрешения. Например, я добавил только разрешение user can view product
, и это разрешение добавляется в таблицу, но когда я выполняю действие add product
с этим пользователем, я могу выполнять это действие, даже если яне дал этой роли действия этому пользователю.
views.py
Изначально я ограничиваю пользователей вводом URL-адреса администратора, если пользовательне суперпользователь и персонал
class RestrictUserMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.path.find("/admin/") > -1:
if not request.user.is_superuser and not request.user.is_staff:
messages.error(request,'You have no permission to view this page')
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
response = self.get_response(request)
return response
settings.py
middleware = 'app.views.RestrictUserMiddleware',
views.py
def update_user_roles(request,id):
user = get_object_or_404(User, id=id)
user_permissions = Permission.objects.all()
if request.method == 'POST':
permissions = request.POST.getlist('user_permissions')
print('hey',permissions)
form = EditUserRole(request.POST or None,instance=user)
if form.is_valid():
role = form.save(commit=True)
role.save()
user.user_permissions.set(permissions)
messages.success(request,'Roles updated for user '.format(user.username))
return redirect('user_profile',user.id)
else:
form = EditUserRole()
return render(request,'update_user_role.html',{'form':form,'user':user,'user_permissions':user_permissions})
add_product
def add_product(request):
categories = Category.objects.all().order_by('-updated')
if request.method == 'POST':
form = AddProductForm(request.POST or None, request.FILES or None)
if form.is_valid():
product = form.save(commit=False)
product.save()
messages.success(request, '{} added.'.format(product.name))
return redirect('add_product')
else:
form = AddProductForm()
return render(request, 'add_product.html', {'form': form,
'categories': categories})
шаблон
<form action="{% url 'update_user_role' user.id %}" method="post" >
{% csrf_token %}
<div class="form-group">
<h5>User Roles</h5>
<div class="controls">
{% for permission in user_permissions %}
<input name ="user_permissions" type="checkbox" id="permission-{{permission.id}}" value="{{permission.id}}" {% if permission in user.user_permissions.all %} checked="checked" {% endif %}>
<label for="permission-{{permission.id}}">{{permission.name}}</label>
{% endfor %}
</div>
</div>
<div>
<button type="submit" class="btn btn-info">Save</button>
</div>
</form>
forms.py
class EditUserRole(forms.ModelForm):
class Meta:
model = User
fields = ['user_permissions']