我有这些(简化)模型:
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算法从用户的电子邮件和当前时间戳生成,我需要:
User
admin path
列的修改字段,并在点击“添加其他邀请”按钮时自动生成path
字段。我不知道如何实现这个目标,有人可以帮助我吗?
答案 0 :(得分:1)
要禁止向extra = 0
课程显示额外的内联邀请表just add InvitationInline
属性:
class InvitationInline(admin.TabularInline):
fields = ('user',)
extra = 0
model = models.Invitation
可能,生成路径的最佳位置是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)
要从path
移除InvitationInline
,只需向其添加fields属性:fields = ('user',)
。