Предложение платформы проекта для веб-приложения с надлежащей аутентификацией пользователя и поддержкой интеграции - PullRequest
0 голосов
/ 17 марта 2011

Итак, у меня есть идея создать веб-приложение. Я новичок в этом бизнесе, но я программист. Мне понравился Python, и я решил начать с Django. Я столкнулся с проблемой со встроенной системой аутентификации пользователя Django , как указано в моем вопросе о SO .

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

Моя простая потребность заключается в том, чтобы всякий раз, когда пользователь что-то сохранял в своем профиле, поле пользователя заполнялось, чтобы я мог ссылаться на него. Для меня это звучит как самая основная потребность для любого веб-приложения.

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

1 Ответ

2 голосов
/ 17 марта 2011

Короче говоря, я использую встроенный в Django Пользователь авторизовался и подумал, что так и будет легко заполнить мое поле пользователя ( Foreignkey) в моей модели, но это делает нет.

Это не просто волшебным образом произойдет. Вам придется сделать это. Модели отделены от запроса, так что это может произойти с вашей точки зрения, или с методом модели (возможно, save), который передается активному пользователю.

Дизайн MVC / MTV отделяет базу данных от логики просмотра / управления. Я не понимаю, какое отношение фреймворк имеет к этому: если вы сами не напишите функциональность, база данных не будет знать, что делать с какой-то таблицей User и текущим вошедшим пользователем (также отделенным от данных). Внедрение этой функциональности также доставит неудобства многим людям ...

В общем, философия python / django: явное лучше, чем неявное.

Теперь решения:

Если вам нужно такое поведение в представлении, для любой формы вы можете написать:

instance = MyForm.save(commit=False) # commit=False prevents DB save.
instance.user = request.user
instance.save()

Вы можете перезаписать метод сохранения в модели, который также принимает необязательный пользовательский аргумент.

def save(self, *args, **kwargs):
    user = kwargs.pop(user, None)
    self.user = user
    super(MyModel, self).save(*args, **kwargs)

 mymodel = MyModel()
 mymodel.save(user=request.user)
...