Django内联 - 允许添加禁用编辑

时间:2012-07-20 07:27:46

标签: django django-admin

您好。在阅读以下问题后,我在问这个问题:Question_1Question_2。 Question_1没有任何适当的答案,Question_2有一个替代解决方案,但不是一个完美的解决方案。

这里我有两个模特和管理员。

models.py

class TaskList(models.Model):
    task_name      = models.CharField(max_length = 255, unique = True)
    description    = models.TextField()
    assignee_role  = models.ForeignKey(Group, related_name = "assignee_roles")
    assignee_name  = models.ForeignKey(User, related_name = "assignee_names")

    def __unicode__(self):
        return "%s" % (self.task_name)

class TaskComments(models.Model):
    tasklist = models.ForeignKey(TaskList)
    time     = models.DateTimeField(null = True, blank = True)
    comment  = models.TextField()

    def __unicode__(self):
        return ""

    def save(self, *args, **kwargs):
        self.time = datetime.datetime.now()
        super(TaskComments, self).save(*args, **kwargs)

admin.py

class TaskCommentsInlineAdmin(admin.TabularInline):
    model           = TaskComments
    can_delete      = False

class TaskListAdmin(admin.ModelAdmin):
    inlines      = [TaskCommentsInlineAdmin, ]

    def add_view(self, request, form_url = '', extra_context = None):
        self.readonly_fields = ()
        return super(TaskListAdmin, self).add_view(request, form_url, extra_context)

    def change_view(self, request, form_url = '', extra_context = None):
        self.readonly_fields = ('task_name', 'description', )
        return super(TaskListAdmin, self).change_view(request, form_url, extra_context)

此处模型 TaskComments TaskList 中用作内联。

情景1

我想要实现的目标是:

添加任务评论时

  • 隐藏字段“time”并在后端更新。
  • 能够输入“评论”并保存。

保存评论后打开

  • 对于已添加的评论,“时间”和“评论”字段都应该是可见的和只读的。
  • 能够按上述方式添加新评论。

情景2

  • 与上一个场景相同。
  • 唯一的补充是,评论应该可以为添加它的用户编辑,并且只能为所有其他用户编辑。 (我可以更新并获得添加评论的用户)。

这些是我想要实现的目标。我尝试在admin中使用 add_view change_view 。但他们不是为内联工作。请提供实现这些目标的解决方案。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您必须使用自定义版本InlineAdmin,该版本使用以下类的自定义版本

  • InlineModelAdmin
  • BaseInlineFormSet

您可以在自定义版本的InlineModelAdmin上添加自己的add_view和change_view

  • 检测记录的所有者(以允许编辑)
  • 显示时间字段

您可以增强BaseInlineFormSet来控制所有运行时方面