Добавление пользовательских ограничений на то, кто может редактировать сообщения в Django - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь добавить ограничения на свой сайт, чтобы только человек, добавивший продукт или публикацию, мог редактировать / удалять этот продукт или публикацию. В настоящее время кнопка редактирования видна всем, поэтому она не идеальна.

У меня была хорошая трещина, но что-то все еще не так, поскольку кнопка редактирования все еще отображается, даже когда я не пишу создатель.

Созданное мной edit_forum_post представление:

@login_required
def edit_forum_post(request, post_id):
    """ Create a view that allows us to edit a post """

    post = get_object_or_404(Post, pk=pk)
    registered_user = request.user.id
    creator = post.creator.id
    if not logged_user == creator:
        messages.error(request, 'You are unable to edit this post')
        return redirect('get_forum')

    if request.method == "POST":
        edit_post = ForumPostForm(request.POST, request.FILES, instance=post)
        if edit_post.is_valid():
            edit_post.save()
            messages.success(request, 'You have successfully updated your post')
            return redirect('forum_post_details', post_id)

            edit_post = CreatePost(instance=post)

            context = {
                'form': edit_post,
                'post': post
            }
            return render(request, 'forum_post_form.html', context)

Пункт, который я добавил в Кнопка редактирования сообщения :

{% if registered_user == post.creator %}
        <a href="{% url 'edit_forum_post' post.id %}" class="btn btn-outline-warning">Edit Post</a>
{% endif %}

Мы будем благодарны за любые отзывы!

1 Ответ

1 голос
/ 26 мая 2020

Вероятно, вы сравниваете идентификатор с объектом User, и это не сработает. Вы можете проверить, является ли request.user.id post.creator_id, с помощью:

{% if <b>request.user.id == post.creator_id</b> %}
    <a href="{% url 'edit_forum_post' post.id %}" class="btn btn-outline-warning">Edit Post</a>
{% endif %}

Что касается представления, вы можете ускорить его, сохранив запрос с:

@login_required
def edit_forum_post(request, post_id):
    post = get_object_or_404(Post, pk=post_id)
    if <b>request.user.id != post.creator_id</b>:
        messages.error(request, 'You are unable to edit this post')
        return redirect('get_forum')
    # &hellip;

Или вы даже можете проверить это в запросе, который вы выполняете для получения объекта Post с помощью:

@login_required
def edit_forum_post(request, post_id):
    post = get_object_or_404(Post, pk=post_id<b>, creator=request.user</b>)
    # &hellip;
...