Установка значения поля модели на основе аутентификации пользователя в Django - PullRequest
0 голосов
/ 04 ноября 2010

Я пытаюсь выборочно обработать поле в моем приложении Django / Python в зависимости от того, вошел ли пользователь в систему или нет. В принципе, у меня есть модель, похожая на следующую:

class Resource(models.Model):
    uploaded = models.DateTimeField()
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True)
    file = models.CharField(max_length=200)

То, что я хочу сделать, это установить для атрибута файла одно значение, если пользователь вошел в систему (и имеет доступ к этому ресурсу на основе теста с некоторыми серверными правами доступа), и другое значение, если пользователь не авторизован тогда значение resource.file фактически будет истинным URL этого ресурса (включая любые ключи безопасности и т. д. для доступа к этому ресурсу).

Из того, что я прочитал, кажется, что вы можете учесть только вошедшего в систему пользователя, передав его через контекст запроса из функции представления в модель. Однако в приведенном выше случае использования я пытаюсь более тщательно контролировать доступ в модели, не требуя кода клиента для вызова специальной функции.

Ответы [ 2 ]

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

На всякий случай, если кому-то интересно, я решил вышеупомянутую проблему, фактически создав собственное поле модели в django, которое затем могло бы иметь метод, который использует пользователя для создания URI. Итак, в базе данных я храню ключ к ресурсу, как указано выше в столбце файла. Однако теперь в столбце файла есть какое-то настраиваемое поле:

class CustomFileField(models.CharField):
    def to_python(self, value):
        ...
        return CustomFileResource(value)


class CustomFileResource:
    def __init__(self, *args, **kwargs):
        ....

    def uri(usr):
       #this method then gets the uri selectively based on the user . 

Шаблон выше хорош тем, что я могу обернуть поле db и затем создать специальный метод для получения URI, основанный на том, кто пытается получить к нему доступ.

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

Лучше всего создать функцию, используемую для доступа к атрибуту файла, и проверить там. В общем, можно превратить атрибут в дескриптор, который делает это неявно, но магия метакласса Джанго помешает этому.

В целом, однако, Django разработан для обработки аутентификации на уровне представления (и делает это очень чисто). Если вам нужна аутентификация на уровне базы данных, рассмотрите другую настройку, например, CouchDB.

...