Доступ к request.user в обобщенном представлении CreateView для определения поля FK в Django
Итак, у меня есть модель, которая включает в себя:
class Place(models.Model):
....
created_by = models.ForeignKey(User)
Мой вид выглядит так:
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
Есть ли способ получить доступ к request.user и установить created_by этому пользователю? Я просмотрел документы, но не могу найти никаких намеков на это.
`
Ответы
Ответ 1
Как насчет переопределения form_valid
, который сохраняет форму? Сохраните его самостоятельно, сделайте все, что вы хотите, затем выполните перенаправление.
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
obj.save()
return http.HttpResponseRedirect(self.get_success_url())
Ответ 2
Я знаю, что это старо, но для других людей с этой проблемой:
Существует еще более простой способ: поскольку сохранение формы несколько раз всегда будет использовать один и тот же экземпляр модели, вы также можете сделать:
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
return super(PlaceFormView, self).form_valid(form)
Таким образом, вы получаете все преимущества супервызова - тривиально видеть, что вы действительно добавляете только эти две строки кода, и вам не нужно повторять себя, реплицируя логику перенаправления.
Ответ 3
Альтернативный способ сделать это - передать пользователя путем перезаписи метода get_initial() в CreateView и изменить метод сохранения в классе PlaceForm для сохранения пользователя:
class PlaceForm(forms.ModelForm):
...
...
...
def __init__(self, *args, **kwargs):
self.created_by = kwargs['initial']['created_by']
super(PlaceForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
obj = super(PlaceForm, self).save(False)
obj.created_by = self.created_by
commit and obj.save()
return obj
class PlaceFormView(CreateView):
...
...
form_class = PlaceForm
def get_initial(self):
self.initial.update({ 'created_by': self.request.user })
return self.initial
Таким образом, логика сохранения по-прежнему инкапсулируется внутри класса формы.