feldo badix
feldo badix

Reputation: 125

how to retrieve request.user from form in django

I have the following codes:

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(FooForm, 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}

This work as far as displaying the different categories available in a form so the user can select one of them to compute some result.

Now my issue is that i want to include the possibility to retrieve the current user logged in user, which is usually done in the view using request.user but because i am using crispy forms the logic has to be implemented in the forms.py above and i cant seem to find a solution.

Upvotes: 0

Views: 55

Answers (1)

Ahtisham
Ahtisham

Reputation: 10126

In your views just pass the user to forms like this:

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()

Upvotes: 1

Related Questions