内联管理员中的自动生成字段

时间:2013-05-04 05:38:07

标签: django django-admin

我有这些(简化)模型:

class User(models.Model):
    email = models.EmailField(unique=True)

class Invitation(models.Model):
    user = models.ForeignKey(User)
    path = models.CharField(max_length=40, unique=True)

path表中的Invitation字段将包含一个SHA1哈希值,该哈希值将用作访问用户数据的URL的一部分。

我有这个管理员代码:

class InvitationInline(admin.TabularInline):
    model = models.Invitation

class UserAdmin(admin.ModelAdmin):
    inlines = (InvitationInline,)

admin.site.register(models.User, UserAdmin)

显示用户并在底部添加邀请列表。

由于path表中的Invitation值将由SHA1算法从用户的电子邮件和当前时间戳生成,我需要:

  1. 默认情况下,User admin
  2. 中没有显示空的“邀请”行
  3. 从管理员中删除path列的修改字段,并在点击“添加其他邀请”按钮时自动生成path字段。
  4. 我不知道如何实现这个目标,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

  1. 要禁止向extra = 0课程显示额外的内联邀请表just add InvitationInline属性:

    class InvitationInline(admin.TabularInline):
        fields = ('user',)
        extra = 0
        model = models.Invitation
    
  2. 可能,生成路径的最佳位置是Invitation模型的save method

    import hashlib
    import random
    
    class Invitation(models.Model):
        user = models.ForeignKey(User)
        path = models.CharField(max_length=40, unique=True)
    
        def save(self, *args, **kwargs):
            if self.pk is None:  # This is true only when the model has
                                 # never been saved to database.
                salt = hashlib.sha1(str(random.random())).hexdigest()[:5]
                self.path = hashlib.sha1(salt +\
                    str(self.user.email)).hexdigest()
    
            super(Invitation, self).save(*args, **kwargs)  
    
  3. 要从path移除InvitationInline,只需向其添加fields属性:fields = ('user',)