Установка перенаправления на основе условий в представлении на основе классов (Django) - PullRequest
1 голос
/ 21 сентября 2019

Я (начинающий) создаю простое приложение для блога.Я создал представление на основе классов для создания поста в блоге, и у него есть отдельный URL.Я хочу, чтобы он перенаправлял на страницу входа (url name = 'login'), если пользователь не вошел в систему. В представлении на основе функций все, что мне нужно сделать, это:

def postCreateView(request):
if not request.user.is_authenticated:
    return redirect('login')

Я не знаюне знаю, как сделать это в представлении на основе классов (унаследованном от универсального CreateView).Я попытался изменить метод init () следующим образом:

def redirectLogin(self):
     return redirect('login')

 def __init__(self, *args, **kwargs):
     if(not self.request.user.is_authenticated):
         redirectLogin()
     super().__init__()

(я назвал класс PostCreateView), но при отладке значение исключения было 'PostCreateView' object has no attribute 'request'.Мне нужен правильный способ (способ соглашения Django, если он существует), чтобы установить перенаправление на основе условий в представлении на основе классов.

Также я запутался, почему он говорит, что представление не имеет атрибута 'request',У каждого просмотра есть запрос.Я уверен в этом, потому что я переопределил метод form_valid(), чтобы установить автора сообщения в качестве текущего пользователя, выполнившего вход в систему, следующим образом:

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid()

И он прекрасно работает, когда я вошел в систему и создалсообщение.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

То, что вы ищете, уже встроено в Django, поэтому не нужно заново изобретать колесо здесь: login_required decorator и LoginRequired Mixin

Ваш подход неверен, потому что вы переопределяете __init__;если вы хотите выполнить свои проверки перед выполнением представления, вы можете захотеть взглянуть на переопределение dispatch()

def dispatch(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        return super().dispatch(request, *args, **kwargs)
    return redirect()
0 голосов
/ 21 сентября 2019

У каждого просмотра есть запрос.Я уверен в этом, потому что я переопределил form_valid()

Нет, , так как это конструктор.Вы сразу делаете проверку, когда создаете объект просмотра, и в это время request, args и kwargs еще не установлены .Фактически они устанавливаются сразу после создания объекта.Это можно увидеть в исходном коде функции view [GitHub] :

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.<b>setup(</b>request, *args, **kwargs<b>)</b>
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)

и setup функция [GitHub] устанавливает .request, .args и .kwargs:

    def setup(self, request, *args, **kwargs):
        """Initialize attributes shared by all view methods."""
        <b>self.request = request</b>
        self.args = args
        self.kwargs = kwargs

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

* 1039Как говорится, то, что вы здесь делаете, уже сделано раньше.Вы можете использовать LoginRequiredMixin [Django-doc] :
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import <b>LoginRequiredMixin</b>

class MyCreateView(<b>LoginRequiredMixin</b>, CreateView):
    # ...

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid()
...