create_object и дополнительные поля создаваемого объекта
Среди убойных возможностей django хочется отметить generic views. Поначалу я их не заметил и практически никак не использовал, но после прочтения этой статьи присмотрелся внимательней и проникся. Сейчас иногда получается, что они напрямую или через функции-обертки реализуют почти весь view-слой сайта.
Одной из проблем, с которой я столкнулся при использовании generic views — это вопрос о том, как добавить в объект, создаваемый через create_object, дополнительные данные. Например, при создании новой статьи хочется автоматом прописывать залогиненного пользователя, который её написал. Поскольку create_object создает и использует ModelForm внутри себя, то способ передачи request.user в эту форму не совсем очевиден.
А способ-то довольно прост — достаточно описать ModelForm внутри функции-обертки над create_object. Если в этом описании переопределить метод save(), то request будет в пределах видимости.
Вот наша модель (models.py):
from django.contrib.auth.models import User
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User)
Вот форма (forms.py):
from django import forms
from articles.models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ('title', 'content', )
А вот та самая функция обертка:
from django.views.generic.create_update import create_object
from articles.forms import ArticleForm
def create_article(request):
class AddArticleForm(ArticleForm):
def save(self):
article = super(AddArticleForm, self).save(commit=False)
article.author = request.user
article.save()
return article
return create_object(request, form_class=AddArticleForm, login_required=True)
Спасибо, действительно неочевидный но простой вариант
Помогло.
Только смущает, что форма будет создаваться при каждой генерации страницы. Может это и не самая большая нагрузка на сайт, но все-таки у меня почему-то имеется стремление избегать таких случаев.
raa
15 Март 12 at 5:26
Тут ведь речь идёт о сохранении в базу данных. Это не самая быстрая операция, так что пара миллисекунд, потраченная на создание класса формы, особой погоды не сделает.
finn
15 Март 12 at 13:33