Разрешение пользователя Django на объект обновления - PullRequest
0 голосов
/ 27 марта 2019

Рабочий процесс указан ниже

  • Пользователь что-то опубликовал. исходный статус сообщения не опубликован (is_published = False)
  • Администратор одобряет сообщение. поэтому статус публикации опубликован (is_published = True)
  • когда публикуется статус сообщения (is_published = True), пользователь не возможность редактировать пост.
  • Чтобы иметь возможность редактировать, сообщение должно быть неопубликовано (is_published = False). Затем пользователь может редактировать сообщение. Требуется подтверждение администратора снова.
def edit_post(request, post_id):
    if request.method == 'POST':
        # adminn start here
        if request.user.is_staff or request.user.is_superuser:
            obj = post.objects.get(pk=post_id)
            form = PostForm(request.POST, request.FILES, instance=obj)
            if form.is_valid():
                post = form.save(commit=False)
                post.submitted = obj.submitted
                post.save()
                return redirect(approved_post)
            else:
                print("form invalid. post. admin")
                # admin end here
        #user star here
        else:
            obj = post.objects.get(pk=post_id)
            form = PostForm(request.POST, request.FILES, instance=obj)
            # check post status. if published cant edit
            if obj.is_published:
                print("no permission . user")
                return redirect(approved_post)  # error page here
            else:
                if form.is_valid():
                    post = form.save(commit=False)
                    post.submitted = request.user
                    post.save()
                    return redirect(approved_post)
                else:
                    print("form invalid. post. user")

    # GET
    else:
        obj = post.objects.get(pk=post_id)
        # checking is user is admin or normal user
        if not request.user.is_staff or not request.user.is_superuser:
            #checking if post is belong to the logged in user
            if obj.submitted == request.user:
                form = PostForm(instance=obj)
            else:
                print("not your object")
        else:
            form = PostForm(instance=obj)
    return render(request, 'post/edit_post.html', {'form': form})

Меня беспокоит, есть ли лучший способ реализовать это.

1 Ответ

0 голосов
/ 27 марта 2019

Проблема, которую вы пытаетесь решить, - разрешение на уровне объекта.Для одного случая использования вы можете написать логику самостоятельно, но я настоятельно рекомендую использовать внешний пакет.

Для этого есть два хорошо известных и поддерживаемых пакета:

Я считаю, что django-rules лучше всего подходит для вашего случая и будет очень проста в реализации.Дайте мне знать, если вам нужен пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...