2013-05-04 2 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) 

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. удалить поле редактирования для столбца path от администратора, и поле «path» автоматически генерируется при нажатии кнопки «добавить другое приглашение».

Я понятия не имею, как этого достичь, может кто-нибудь мне помочь?

ответ

1
  1. Чтобы отключить отображение дополнительных инлайн приглашения формирует атрибут just addextra = 0 к вашему InvitationInline классу:

    class InvitationInline(admin.TabularInline): 
        fields = ('user',) 
        extra = 0 
        model = models.Invitation 
    
  2. Наверное, самое лучшее место, чтобы поставить поколение пути является save method из Invitation модели:

    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) 
    

Чтобы удалить path из InvitationInline, просто добавьте fields к нему: fields = ('user',).

Смежные вопросы