джангонавт.ru

create_object и дополнительные поля создаваемого объекта

with 2 comments

Среди убойных возможностей 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)

Written by finn

Август 30th, 2009 at 12:49 дп

2 Responses to 'create_object и дополнительные поля создаваемого объекта'

Subscribe to comments with RSS or TrackBack to 'create_object и дополнительные поля создаваемого объекта'.

  1. Спасибо, действительно неочевидный но простой вариант :) Помогло.

    Только смущает, что форма будет создаваться при каждой генерации страницы. Может это и не самая большая нагрузка на сайт, но все-таки у меня почему-то имеется стремление избегать таких случаев.

    raa

    15 Март 12 at 5:26

  2. Тут ведь речь идёт о сохранении в базу данных. Это не самая быстрая операция, так что пара миллисекунд, потраченная на создание класса формы, особой погоды не сделает.

    finn

    15 Март 12 at 13:33

Leave a Reply