Как отправить зашифрованные идентификаторы в админ-адресах интерфейса администратора django? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть приложение, которое использует интерфейс администратора django.Это приложение позволяет пользователю выполнять операции CRUD на своих продуктах.Во время этих операций в URL-адресе администратора отображается фактическое значение идентификатора этого продукта, например https://localhost/product/1/change.. Я ищу возможность отправить скрытое значение идентификатора, отображаемое в URL-адресе, например * 1004.мысли о том, как этого добиться?

У меня уже есть функция, которая дает запутанное значение для данного идентификатора, но как использовать эту функцию в административных URL-адресах, которые генерируются автоматически?

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Вероятно, вам нужно поле слаг: https://docs.djangoproject.com/en/2.2/ref/models/fields/#slugfield Он делает именно то, что вы хотите.

0 голосов
/ 23 сентября 2019

Хотя мне нравится ответ Александра Кононенко (я не знал о Слагфилде, спасибо за то, что указал на это), возможно, все же стоит использовать очень упрощенный подход:

import base64

partnr='23'
partobf=base64.b32encode((bytes(partnr, 'utf-8'))).decode('utf-8').replace('=', '')
print(partobf)

# reverse it, if you need to deduce a part number from a given URL
partnrb=base64.b32decode('{}{}'.format(partobf, '='*(8-len(partobf)%8))).decode('utf-8')    
print(partnrb)

Выходные данные:

GIZQ

23

Это работает для любой строки (не только числа) и легко обратимо.Вместо Base32 вы также можете использовать Base64 или любую другую кодировку, в которой используются символы, совместимые с URL-адресами.Используя этот метод, вы можете преобразовать любой идентификатор из открытого текста в запутанный текст без словаря, в котором хранятся оба значения.

Однако важно указать, что ничего из этого (а также нет)остальные ответы, присутствующие в ветке до сих пор) имеют отношение что-либо к шифрованию.Так что, вероятно, ОП должен сменить заголовок.

0 голосов
/ 23 сентября 2019

Возможно, вы можете использовать UUIDField, который можно использовать как уникальную идентификацию.Вы можете добавить UUIDField к модели следующим образом:

import uuid

class Product(models.Model):
    unique_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)

И использовать его с URL следующим образом:

# url

path('product/<uuid:unique_id>', views.product, name='product')

# view

def product(request, unique_id):
     product = get_object_or_404(Product, unique_id=unique_id)

Кроме того, вы можете использовать UUIDField в качестве первичного ключа,потому что (из документации):

Универсально уникальные идентификаторы являются хорошей альтернативой AutoField для primary_key.База данных не будет генерировать UUID для вас, поэтому рекомендуется использовать значение по умолчанию:

...