Как я могу добавить вспомогательную функцию в Django, чтобы сопоставить тему с ее пользователем и показать Http404, если это не так? - PullRequest
0 голосов
/ 24 сентября 2019

спасибо заранее.Это мой первый пост, постараюсь быть кратким.Я собираюсь выполнить упражнение 19-3 «Рефакторинг в Python Crash Course».Однако я немного застрял в этом.Я должен сделать функцию, чтобы проверить владельца темы, и если нет, то поднять ошибку Http404.

Я попытался создать папку «utils» и разместить там свою функцию, но у меня произошла ошибка имени, поэтому я удалил ее.Затем попытался сохранить функцию в том же файле, но я поднял ошибку Http404, даже когда пользователь был владельцем темы.Я оставил его, как и прежде, пытаясь выполнить это упражнение с закомментированной функцией:

from django.shortcuts import render
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry
from .forms import TopicForm, EntryForm

@login_required
def topic(request, topic_id):
    topic = Topic.objects.get(id=topic_id)
    # check_topic_owner(request)
    if topic.owner != request.user:
        raise Http404

    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

@login_required
def edit_entry(request, entry_id):
    """Edit an existing entry"""
    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic
    # check_topic_owner(request)
    if topic.owner != request.user:
        raise Http404

    if request.method != 'POST':
        form = EntryForm(instance=entry)

#The function to check owner is here:
def check_topic_owner(request):
    owner = Topic.owner
    if owner != request.user:
        raise Http404

Мне трудно понять, как я могу сделать «вспомогательную» функцию, если ей нужна какая-то дополнительная информация, такая какИдентификатор темы и определение владельца.Надеюсь, вы можете помочь мне, большое спасибо.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Вы должны сделать проверку в самом запросе.get_object_or_404 повысит 404, если соответствующий предмет не найден.Итак:

@login_required
def edit_entry(request, entry_id):
    entry = get_object_or_404(Entry, id=entry_id, topic__owner=request.user)
1 голос
/ 24 сентября 2019

Проблема в том, что в check_topic_owner() вы используете Topic.owner, который, скорее всего, вернет определение поля.Вы не используете экземпляр Topic там.

Если вы сделаете что-то подобное

def edit_entry(request, entry_id):
    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic
    check_topic_owner(topic.owner, request)
    ...

def check_topic_owner(owner, request):
    if owner != request.user:
        raise Http404

, у вас все будет хорошо.

...