django自动根据模型属性填充一些数据

时间:2011-01-18 15:09:38

标签: python django

正在开发一个概念,我希望在保存模型时捕获某些信息。为了理解全貌,我有一个带有以下模型的应用核心

芯/ models.py

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from transmeta import TransMeta
from django.utils.translation import ugettext_lazy as _

import signals


class Audit(models.Model):
    ## TODO: Document
    # Polymorphic model using generic relation through DJANGO content type
    operation  = models.CharField(_('Operation'), max_length=40)
    operation_at = models.DateTimeField(_('Operation At'), auto_now_add=True)
    operation_by = models.ForeignKey(User, null=True, blank=True, related_name="%(app_label)s_%(class)s_y+")
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

审核模型是一种通用内容类型,目前正在将其与其他应用程序(如博客

)相关联

博客/ models.py

from django.db import models
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _
# Create your models here.



    class Meta:
        verbose_name_plural = "Categories"

class article(models.Model):
    title            = models.CharField(max_length=100)
    slug             = models.SlugField(editable=False, unique_for_year=True)
    content          = models.TextField()
    is_active        = models.BooleanField()
    published_at     = models.DateTimeField('Publish at',auto_now=True)
    related_articles = models.ManyToManyField('self', null=True, blank=True)
    audit_obj        = generic.GenericRelation('core.Audit', editable=False, null=True, blank=True)

我的第一次尝试是,我做了一个post_save信号,其中我正在检查传递的实例是否包含audit_obj属性,然后使用article.audit_obj.create().save()保存记录。

不幸的是,这对我来说并不完全有效,因为我无法传递请求,也无法访问请求以检索用户信息。

所以,我正在考虑创建一个自定义信号并覆盖form_save方法(如果有这样的事情),然后使用参数传递请求对象以及模型对象。

关于我如何做到这一点的任何建议?

此致

编辑(2011年1月20日):

感谢@Yuji的时间。那么,我想要实现的是尽可能保持我的代码干燥。我最终想要做的是,每次创建新模型时,我只会创建一个额外的属性并将其命名为audit_obj,我将创建一个代码段,或者是信号,或者覆盖django核心内部的save方法。代码中的代码将始终检查是否存在具有以下名称的属性,从而在aduti表中创建记录。

1 个答案:

答案 0 :(得分:3)

我只是在我的模型类或管理器中创建一个函数,并从我的表单保存(无论你在哪里)调用它

class AuditManager(models.Manager):
    def save_from_object(self, request, obj):
        audit = Audit()
        audit.object_id = obj.id
        audit.operation_by = request.user
        # ...

        audit.save()


class Audit(models.Model):
    ## TODO: Document
    # Polymorphic model using generic relation through DJANGO content type
    operation  = models.CharField(_('Operation'), max_length=40)
    operation_at = models.DateTimeField(_('Operation At'), auto_now_add=True)
    operation_by = models.ForeignKey(User, null=True, blank=True, related_name="%(app_label)s_%(class)s_y+")
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    objects = AuditManager()


class MyBlogForm(forms.ModelForm):
    class Meta:
        model = article # btw I'd use Capital Letters For Classes

    def save(self, *args, **kwargs):
        super(MyBlogForm, self).save(*args, **kwargs)
        Audit.objects.save_from_object(request, self.instance)