Django, представления классов: Как сохранить данные сеанса с объектом формы? - PullRequest
1 голос
/ 31 декабря 2011

Я пытаюсь сохранить имя пользователя из сеанса текущего запроса в объекте 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 (), он вызывает его собственную версию, а не мое переопределение; мой код никогда не работал вообще.

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

«Правильный» способ сделать это - написать собственное представление для создания объекта, если общее представление недостаточно.Представления создания относительно короткие, и есть множество примеров того, как сохранить внешние ключи.

0 голосов
/ 01 января 2012

Кстати, где-то там в документации Django 1.3 говорится, что обсуждаются изменения в модели аутентификации, используемой приложением администратора, например, добавление разрешений для каждого экземпляра. (Текущая модель аутентификации поддерживает только разрешения для каждой модели.) Разработчики также могут добавить реализацию того, чего я пытаюсь достичь. В конце концов, связанные с пользователями данные используются почти на всех веб-сайтах.

...