Получение текущего пользователя в Django FormView

Я создаю сайт объявлений, и каждый пользователь связан с компанией. Прежде чем пользователь сможет опубликовать новое объявление, он должен купить кредиты. Если кредитов нет, FormView должен показать шаблон с уведомлением о 0 кредитах, однако если кредитов > 0, то должна появиться настоящая форма.

Я пытаюсь получить данные о текущем пользователе в самом классе FormView. Я знаю, что это можно сделать через метод form_valid user = self.request.user, но это означает, что пользователь должен сначала заполнить всю форму и отправить ее после проверки, достаточно ли у него кредитов. Я пытаюсь понять, как выполнить проверку до того, как форма будет заполнена и отправлена. Я не смог найти никаких ресурсов, как я могу сделать что-то вроде этого:

class CreateAd(LoginRequiredMixin, FormView):
    if currents_user.ad_credits > 0:
        template_name = 'ads/ad_form.html'
        form_class = AdForm
        success_url = '/'
    else:
        template_name = 'ads/not_enough_credits.html'
        form_class = AdForm
        success_url = '/'

Вы можете использовать get_form_kwargs:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    user = self.request.user
    kwargs['initial'] = ... # here update the form kwargs based on user
    return kwargs

Вы можете переопределить функцию 'get' следующим образом.

def get(self, request, *args, **kwargs):
    if currents_user.ad_credits > 0:
        super(Login, self).get(request, *args, **kwargs)
    else:
        raise HttpResponseBadRequest # Or what kind of error that you like

Надеюсь, это поможет.

Я обнаружил, что добавление объекта текущего пользователя через get_context_data() и последующее отображение шаблона на основе {% if current_user.ad_credits > 0 %} было для меня самым простым решением. Если кредитов мало, шаблон будет показывать только уведомление о том, что пользователь должен пополнить счет.

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['current_user'] = self.request.user
    return context
Вернуться на верх