Запутанный Django URL для объектов модели - PullRequest
2 голосов
/ 08 ноября 2010

У меня есть модель Django, которая выглядит примерно так:

class Person(models.Model):

    name = models.CharField(max_length=32)
    place = models.ForeignKey(Place, related_name='people')
    approved = models.BooleanField()
    objects = PersonManager()

    @models.permalink
    def get_absolute_url(self):
        return('deal_details', (), {
            'person_slug': slugify(self.name),
        })

Как вы могли видеть, у меня уже есть абсолютный URL для объекта. Однако я хочу создать трудно угадываемый URL-адрес, чтобы отслеживать процесс утверждения объекта. Кто-нибудь сделал что-то подобное и / или есть предложения о том, как мне поступить?

Моей первой мыслью было создание поля модели, например obfuscated_key, которое генерируется случайным образом с помощью функции save модели . Тогда URL будет выглядеть примерно так: /people/status/<id>/<obfuscated_key>/. Но, возможно, есть лучший способ сделать это?

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Хороший способ сделать это - хэшировать идентификатор объекта с помощью секретного ключа установки (из settings.py). Это то, что делает форма электронной почты для сброса пароля - есть полезный код в django.contrib.auth.tokens - и, в самых последних версиях SVN, django.contrib.auth.crypto.

0 голосов
/ 09 ноября 2010

Я использовал UUIDField, чтобы сделать нечто подобное.

В модели:

uuid = UUIDField(auto=True)

, затем в представлении проверьте id и uuid:

item = get_object_or_404(Item, id=id, uuid__exact=uuid)

Поле UUIDField от http://djangosnippets.org/snippets/335/

0 голосов
/ 08 ноября 2010

Может работать что-то вроде сокращения URL (читай: запутывание).

http://djangosnippets.org/snippets/1323/

...