Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建Django admin后仅显示一次字段_Python_Django_Django Admin - Fatal编程技术网

Python 创建Django admin后仅显示一次字段

Python 创建Django admin后仅显示一次字段,python,django,django-admin,Python,Django,Django Admin,我正在尝试为我的API创建一个API密钥的实现,这样外部人员就可以请求一个API密钥,他们就可以访问我的资源。现在我正在使用Django管理员来显示和创建这些API键 class External(models.Model): id = models.UUIDField(primary_key=True, default=uuid4) name = models.CharField(max_length=255, null=False, blank=False) is

我正在尝试为我的API创建一个API密钥的实现,这样外部人员就可以请求一个API密钥,他们就可以访问我的资源。现在我正在使用Django管理员来显示和创建这些API键

class External(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4)

    name = models.CharField(max_length=255, null=False, blank=False)

    is_enabled = models.BooleanField(default=True)
    revenue_percentage = models.FloatField()

    created = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.name


class ApiToken(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4)
    name = models.CharField(max_length=255, null=False, blank=False)

    external = models.ForeignKey(External, on_delete=models.CASCADE)

    token_hash = models.CharField(max_length=128)
    token = models.CharField(max_length=128)

    created = models.DateTimeField(default=timezone.now)

    def save(self, *args, **kwargs):
        if self._state.adding:  # In order to know if it's being created
            api_key = get_random_string(length=32)

            concat = f'{self.id}:{api_key}'
            key_bytes = concat.encode('ascii')
            base = base64.b64encode(key_bytes)
            token = base.decode('ascii')
            self.token = token
            self.token_hash = make_password(api_key)

        super(ApiToken, self).save(*args, **kwargs)

这是管理员

class ApiTokenAdmin(admin.TabularInline):
    model = ApiToken
    extra = 0
    fields = ('id', 'name', 'token', 'created')
    readonly_fields = ('created', 'token')
    exclude = ('id',)


class ExternalAdmin(admin.ModelAdmin):
    search_fields = ('id', 'name',)
    list_display = ('id', 'name', 'revenue_percentage', 'is_enabled',)
    list_filter = ('is_enabled',)
    fields = ('id', 'name', 'is_enabled', 'revenue_percentage')
    readonly_fields = ('id', 'created')

    inlines = [ApiTokenAdmin]


admin.site.register(External, ExternalAdmin)
如您所见,我正在存储我想要共享的令牌

self.token = token
问题是,我不想将该令牌存储在数据库中,我只想在创建新的API密钥后计算并显示一次,然后管理员可以复制并与外部人员共享它


有没有办法做到这一点,我试图覆盖
save\u model
save\u formset
,但它们只是不返回新对象,因此在调用
save
方法后,我无法设置值。

我认为可以在创建对象后立即使用django信号从数据库中删除值。我猜pre\u save或post\u save可以做到这一点事情