Как получить 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()