Доступ к request.user в основанном на классе универсальном представлении CreateView для установки поля FK в Django - PullRequest
27 голосов
/ 26 апреля 2011

Итак, у меня есть модель, которая включает в себя:

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 и установить для selected_by значениеэтот пользователь?Я просмотрел документы, но не могу найти никаких подсказок на этот счет.

`

Ответы [ 3 ]

27 голосов
/ 26 апреля 2011

Как насчет переопределения form_valid, которое сохраняет форму?Сохрани его сам, делай с ним что хочешь, потом перенаправляй.

13 голосов
/ 12 декабря 2015

Я знаю, что это старая версия, но для других людей с этой проблемой:

Существует еще более простой способ - поскольку при многократном сохранении формы всегда будет использоваться один и тот же экземпляр модели, вы также можете сделать следующее:

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.created_by = self.request.user
    return super(PlaceFormView, self).form_valid(form)

Таким образом, вы получаете все преимущества супер-вызова - легко увидеть, что вы действительно добавляете только эти две строки кода, и вам не нужно повторять себя, реплицируялогика перенаправления.

2 голосов
/ 11 сентября 2011

Альтернативный способ сделать это - передать пользователю перезаписать метод get_initial () в CreateView и изменить метод save в классе 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

Таким образом, логика сохранения все еще инкапсулирована в классе формы.

...