Как получить request.user из формы в django

У меня следующие коды:

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ...

...

class Category(models.Model):
    name = models.CharField(max_length=30)
    ...

forms.py

class FooForm(forms.Form):

    # how to call 'request.user' here so i can achieve something like the two lines below ???
    # user = User.objects.filter(username=request.user).first() <=== GOAL
    # profile = Profile.objects.filter(user=user).first() <=== GOAL

    categories = list(Category.objects.values_list("name", flat=True))

    categories_values = list(zip(topics, topics))
    
    categories = forms.TypedChoiceField(
        label="Select a category",
        choices=categories_values,
        coerce=str,
        widget=forms.RadioSelect,
        initial=topics[0],
        required=True)

    def __init__(self, *args, **kwargs):
        super(ExperienceStart, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.layout = Layout(InlineRadios('categories'),)


views.py

def experience_start(request):
    form = FooForm(request.POST)
    
    if request.method == "POST":

        if form.is_valid():
            # do something
            ...

    else:
        form = FooForm()

    context = {"form": form}

Эта работа заключается в отображении различных категорий в форме, чтобы пользователь мог выбрать одну из них для вычисления некоторого результата.

Теперь моя проблема в том, что я хочу включить возможность получения текущего пользователя, вошедшего в систему, что обычно делается в представлении с помощью request.user, но поскольку я использую crispy forms, логика должна быть реализована в forms.py выше, и я не могу найти решение.

У меня заканчиваются идеи, любая помощь была бы полезна, спасибо

В ваших представлениях просто передайте пользователя формам следующим образом:

views.py:

def experience_start(request):
   form = FooForm(request.POST, user=request.user)
   # rest of the code

forms.py:

class FooForm(forms.Form):

  user = None
  profile = None

  # rest of the code

  def __init__(self, *args, **kwargs):
      super(ExperienceStart, self).__init__(*args, **kwargs)
      user = kwargs.pop('user', None)
      self.helper = FormHelper()
      self.helper.form_method = 'post'
      self.helper.layout = Layout(InlineRadios('categories'),)
      if user:
         self.user = User.objects.filter(username=user.username).first()
         self.profile = Profile.objects.filter(user=user).first()
Вернуться на верх