Django静态内联

时间:2016-11-07 14:02:39

标签: python django django-models django-admin

我的模型Student包含大量字段,模型Document包含ForeignKeyStudent。我使用内联编辑Student s'关联Document s。

models.py:

class Document(models.Model):

    def media_path(instance, filename):
        return '{0}/{1}'.format(instance.Student.Id, filename)

    File = models.FileField(
        _('File'),
        upload_to=media_path,)

    Title = models.CharField(
        _('File Name'),
        max_length=32,
        blank=True,)

    Student = models.ForeignKey(
        Student,
        null=True,
        on_delete=models.SET_NULL)

    class Meta:
        verbose_name = _('Document')
        verbose_name_plural = _('Documents')

admin.py:

class DocumentInline(admin.TabularInline):
    model = Document
    extra = 0


class StudentAdmin(UserAdmin):
    ...
    inlines = [
        DocumentInline,
    ]

    class Meta:
        model = Student


admin.site.register(Student, StudentAdmin)

我想要的是每次创建Document时添加3条带有特定Title的内联Student行,例如:

我刚刚创建了Student,我在Document内联部分已经有3行,每行都有一个预先定义的Title(而File显然是空):

  • 档案1
  • 文件2
  • 文件3

我该怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以添加接收器来拦截保存后信号:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Student)
def create_default_docs(sender, instance, created, **kwargs):
    if created:
        for title in ['title1','title2','title3']:
            d = Document(title=title, student=instance)
            d.save()

此代码在学生模型保存后执行。如果刚刚创建了模型,它将创建具有指定默认标题的三个文档。

有一点需要注意,您需要允许您的文件字段允许空值,因为它是必填字段。