2013-05-04 111 views
1

我有这些(简体)型号:自动生成在线管理领域

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) 

Invitation表将包含将被用来作为访问的URL的一部分SHA1哈希的path场用户的数据。

我有这样的管理代码:

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

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

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

这显示用户,并在底部增加了邀请列表。

由于我在Invitationpath值将被从用户的电子邮件和当前的时间戳SHA1算法来生成,我需要:

  1. 在默认情况下不显示空“邀请”行User admin
  2. 从admin中删除path列的编辑字段,并在单击“添加其他邀请”按钮时自动生成path字段。

我不知道如何做到这一点,有人可以帮助我吗?

回答

1
  1. 禁用额外的内联邀请的显示形式,你InvitationInlinejust addextra = 0属性:

    class InvitationInline(admin.TabularInline): 
        fields = ('user',) 
        extra = 0 
        model = models.Invitation 
    
  2. 也许,把路径生成最好的地方是save methodInvitation模式:

    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) 
    

要删除pathInvitationInline只需添加fields属性:fields = ('user',)