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 говорится, что обсуждаются изменения в модели аутентификации, используемой приложением администратора, такие как добавление разрешений для каждого экземпляра. (Текущая модель аутентификации поддерживает только разрешения для каждой модели.) Разработчики могут также добавить реализацию того, чего я пытаюсь достичь. В конце концов, связанные с пользователями данные используются практически на всех веб-сайтах.

Другие вопросы по тегам