Django, представления классов: Как я могу сохранить данные сеанса с объектом формы?
Я пытаюсь сохранить имя пользователя из сеанса текущего запроса в объекте 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.
Я нашел этот пост, который описывает примерно то же самое, но с неправильной точки зрения, и вместо этого использует функциональные представления.
До сих пор я думал о том, чтобы переопределить что-то в классе формы и вставить имя пользователя в очищенные данные. Есть ли способ лучше? Есть ли правильный путь?
Изменить: Решение до сих пор, нерабочее, с IntegrityError: 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(), он вызывает свою собственную версию, а не мое переопределение; мой код никогда не работал вообще.
2 ответа
"Правильный" способ сделать это - написать собственное представление для создания объекта, если универсальное представление не достаточно. Представления о создании относительно короткие, и есть множество примеров того, как сохранить внешние ключи.
Кстати, где-то там в документации Django 1.3 говорится, что обсуждаются изменения в модели аутентификации, используемой приложением администратора, такие как добавление разрешений для каждого экземпляра. (Текущая модель аутентификации поддерживает только разрешения для каждой модели.) Разработчики могут также добавить реализацию того, чего я пытаюсь достичь. В конце концов, связанные с пользователями данные используются практически на всех веб-сайтах.