OneToOneField를 이용하여 customUser 모델을 만들었을 때, 추가한 필드를

 
SungYong Lee

OneToOneField를 이용하여 customUser 모델을 만들었을 때, 추가한 필드를 건드리지않았을 때는 customUser로 인식하지 않는 문제에 대한 질문이 있습니다.

https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#extending-user 를 참고해서 아래와 같이 만들었어요.

아바타 이미지를 업로드 하지 않은 사용자들은 기본으로 제공하는 image의 url을 보내주도록 하는게 목표였습니다.

—————-some_app.views.py————–
class CustomUser(models.Model):
….user = models.OneToOneField(User, related_name=’profile’)
….avatar_img_file = models.ImageField(upload_to=upload_to, blank=True, null=True)

….def get_avatar_url(self):
……..if not self.avatar_img_file:
…………return “http://placeholder.me/40×40”
……..else:
…………return self.avatar_img_file.url

———some_template.html—————
[…생략…]

[…생략…]

그런데, 제대로 작동이 되지 않더군요. 이미지를 한번이라도 업로드 하지 않았던 회원은 아무 url도 가져오지 않고 있었습니다. 원래 목표는 avatar_img_file이 비어 있는 회원들은 디폴트 이미지의 url을 돌려주는 것이었는데, 이미지를 올렸다가 삭제한 경우에는 디폴트이미지 url을 잘 반환시켜주는데 말입니다.

shell에서 CustomUser.objects.count()로 회원 갯수를 세보니, 아바타 이미지를 한번이라도 업로드했던 회원들만 CustomUser에 잡히고 (이미지를 올렸다가 삭제한 경우에도 CustomUser로 잡힙니다.), 나머지는 그냥 User로만 되어 있었습니다. 그래서 get_avatar_url에 접근하지 못했던 것 같아요.

이런 경우에 어떻게 해야하나요?

  • SungYong Lee

    아 참! 메리크리스마스입니다

    김명준

    회원가입을 할 때 새로 생성된 회원의 User pk 값이 들어간 CustomUser 객체가 생성되어야 하는거 아닌가요?(저도 초보라..)그래서 저는 회원가입을 처리하는 뷰에서 객체를 생성하고 디폴트 이미지 url을 지정해줬습니다.

    SungYong Lee

    아 그런가요
    전 admin을 통해서 생성했었습니다.

    Chinseok Lee

    각 User 별로 CustomUser 이 생성이 되어야 합니다. 없다면 user.profile 에서 CustomUser.DoesNotExist 예외가 발생하게 됩니다. 템플릿 내에서는 이 DoesNotExist 예외를 무시하고 별 다른 메세지를 보여주지 않습니다.

    각 User 인스턴스의 post_save 시에 CustomUser 인스턴스를 생성해주시던지, 혹은 따로 CustomUser 인스턴스 유무를 체크해서 생성해주는 함수를 만들어주셔도 좋겠습니다. // AskDjango

    SungYong Lee

    답변 감사합니다. 현재 allauth를 사용하고 있는데, User의 post_save를 건드리려면 allauth에서 회원가입 부분을 건드려야 하려나요…..생각보다 꽤나 복잡하네요…

    Chinseok Lee

    아니요. 쓰시는 코드에서 django.contrib.auth.models.User 모델을 임포트해서 post_save 시그널을 처리하시면 됩니다. // allauth 도 django.contrib.auth.models.User 모델을 쓰고 있으니깐요.

    from django.contrib.auth.models import User
    from django.db.models.signals import post_save

    def user_saved(sender, **kwargs):
    … if kwargs[‘created’]:
    ……. # 관련 처리

    post_save.connect(user_saved, sender=User)

    django 에서는 settings.AUTH_USER_MODEL 을 지정함으로서 User 모델을 변경할 수 있는 데요. 이 경우는 처리가 좀 더 필요합니다.

    SungYong Lee

    이진석 감사합니다. signal이라던지 각 인스턴스 간의 관계라던지 이런 지식들이 전혀 없었는데 덕분에 알게 되었습니다. 말씀해주신 것을 토대로 검색해본결과 좋은 문서가 있어서 그걸 보고 따라하니 원하던 것이 해결되었습니다.

    고맙습니다! 장고 커뮤니티 너무 좋아요.

    다른 분들을 위해서 링크를 공유합니다.
    http://www.marinamele.com/taskbuster-django-tutorial/model-creation-onetoone-relationship-signals-django-admin

Advertisements