Я пытаюсь сохранить имя пользователя из сеанса текущего запроса в объекте db. Как я могу сделать это из представления на основе классов? Есть ли «чистый» способ сделать это? Что я должен переопределить / подкласс?
У меня есть модель, которая выглядит так:
from django.contrib.auth.models import User
class Entry(django.db.models.Model):
...
author = models.ForeignKey(User, editable=False)
У меня также есть представление, основанное на встроенном универсальном представлении django.views.generic.CreateView
. Я также использую класс ModelForm по умолчанию, который идет с моей моделью, и стандартный {{ form }}
в моем шаблоне. AFAIK, приложения / промежуточное ПО для сеансов и аутентификации настроены правильно - по умолчанию в новых проектах Django.
Я нашел этот пост , который описывает примерно то же самое, но под неправильным углом, и вместо этого использует функциональные представления.
До сих пор я думал о том, чтобы переопределить что-то в классе формы и вставить имя пользователя в очищенные данные. Есть ли способ лучше? Есть ли правильный способ?
Редактировать: Решение пока не работает, с ошибкой IntegrityEr: author_id не может быть нулевым
from django.views.generic import CreateView
class Index(CreateView):
model = magicModel
template_name = "index.html"
success_url = "/magicWorked"
...
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = request.user
return super(Index, self).form_valid(form)
Я написал это на основе того, что нашел в django / views / generic / edit.py, где эта реализация используется для класса ModelFormMixin:
def form_valid(self, form):
self.object = form.save()
return super(ModelFormMixin, self).form_valid(form)
Это метод, вызываемый super (). Form_valid () выше.
Редактировать: Проблема с моим решением заключалась в моем понимании модели наследования Python. Когда суперкласс вызывает form_valid (), он вызывает его собственную версию, а не мое переопределение; мой код никогда не работал вообще.