2012-05-07 4 views
1

Мне было интересно, как мы можем получить доступ к данным пользователя в другой модели? Например, вот моя текущая ситуация.Доступ к аутентификации Информация пользователя в Django Model

  • У пользователя есть иностранный ключ к компании; поэтому пользователь связан с компанией.
  • Я внедрил страницу загрузки файла. На этой странице используется специальное решение для хранения, которое загружает файл в Amazon S3. (Он основан на S3BotoStorage).
  • Внутри этого конструктора я хочу получить доступ к имени bucket_name, которое связано с этой компанией, где компания связана с пользователем. Все мои пользователи должны будут войти в систему, чтобы использовать страницу загрузки.
  • Итак: вошел Пользователь имеет foreignKey для Компании, а у компании есть bucket_name. Зарегистрированный пользователь находится на странице загрузки файлов.

Это мнение:

class PictureCreateView(CreateView): 
    model = Picture 

    def __init__(self, *args, **kwargs): 
     super(PictureCreateView, self).__init__(*args, **kwargs) 


    def form_valid(self, form):  
     self.object = form.save() 
     self.request.FILES.get('file') 
     data = [{'name': f.name, 'url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'thumbnail_url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'delete_url': reverse('upload-delete', args=[self.object.id]), 'delete_type': "DELETE"}] 
     response = JSONResponse(data, {}, response_mimetype(self.request)) 
     response['Content-Disposition'] = 'inline; filename=files.json' 
     return response 

Это изображение модели (Файл модели или любой другой)

from django.core.files.storage import default_storage as s3_storage 

class Picture(models.Model): 

    def custom_upload_to(instance, filename): 
     return 'pictures/' + filename   

    def save(self, *args, **kwargs): 
     super(Picture, self).save(*args, **kwargs) 

    file = models.FileField(storage=s3_storage,upload_to=custom_upload_to) 

Это модель хранения данных, я установил, как мой default_storage в settings.py:

from storages.backends.s3boto import S3BotoStorage 

class customStorage(S3BotoStorage): 
    def __init__(self, *args, **kwargs): 
     kwargs['bucket'] = ***HERE-I-WANT-TO-GET-COMPANY'S-BUCKET*** 
     super(customStorage, self).__init__(*args, **kwargs) 

От шаблона или шаблона, могу ли я передать его, есть аргумент и получить его позже? Могу ли я получить эту информацию непосредственно в модели? Есть идеи, как это сделать?

Спасибо!

EDIT: Это связано с пользователями, поскольку пользователь будет содержать ForeignKey к компании она связана с, и что компания будет содержать ведро вопрос ...

EDIT # 2: Я просто пытался self.object.user = self.request.user в form_save, и он работает, но как я могу выйти за рамки этого и получить доступ к полям, которые я добавил, когда я расширил User с помощью класса UserProfile? Например:

self.object.user = self.request.user 
self.company = self.object.user.company.bucket 

Таким образом, компания является foreign_key в расширенном профиле пользователя, а компания содержит поле ведра.

+1

Я действительно смущен. Какое отношение это имеет к пользователям? Вы можете получить текущего пользователя из form_valid() с помощью self.request.user. Это то, что вам нужно? – Paragon

+0

См. Править для получения дополнительных разъяснений! Спасибо – abisson

+0

Вы ищете 'user.get_profile()'? https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.models.User.get_profile – rantanplan

ответ

0

Вы не можете изменить пользователя, поэтому я предполагаю, что ваш внешний ключ находится в профиле. Вероятно, вы хотите использовать self.request.user. get_profile() .company.bucket. Убедитесь, что вы правильно настроили свой модуль профиля, установив AUTH_PROFILE_MODULE в свои настройки.py

Смежные вопросы