다음 그림과 같

 
서대원

다음 그림과 같이 django User 모델과 UserProfile 모델간에 OneToOne Field를 만들어주었습니다.

1. 그렇다면 가입 폼을 만들때에는 보통의 경우 UserCreationForm을 이용해서 만들던데, 다음과 같이 User에 있는 필드가 아닌 UserProfile에 저장되어야 할 내용을 입력하는 공간을 만들때에는 또다른 폼을 하나 더 생산해서
그곳에 입력을 해주어야 하는것인가요?
보통의 경우 어떻게 코드를 작성하시는지 도움을 주시면 감사하겠습니다.

2. 처음 유저가 가입을 하였을때, superuser의 승인을 거친후 활동을 할 수 있게 절차를 구성하고 싶습니다. 그렇다면, 가입시 유저의 is_active를 False로 처음 설정하도록 해두고, 후에 superuser가 변경할 수 있도록 하는 것이 좋은가요?
아니면 기타 조건을 두는 것이 효율적인가요?

p. 좋은 답변 주시면 감사하겠습니다. 아직 초보자이기에 여러가지로 고민할 것도 많고 힘든 부분도 많네요 ㅜㅜ


  • Chinseok Lee

    1) UserCreationForm 을 쓰실 때에는, UserCreationForm 은 User 모델에 대한 ModelForm 입니다. UserProfile 에 저장되어야할 필드는 추가로 필드 정의를 하시고, validation 도 같이 구현하시구요. form save 시에 user 모델을 저장하고 나서 UserProfile 에 대해서도 저장을 하시면 되겠습니다.

    2) 현재로는 말씀하신 대로 처리하셔도 무방할 듯 하네요. // AskDjango

    서대원

    Chinseok Lee 진석님 답변감사합니다. 2번 부분에 대해서 추가질문 하나드려도 될까요? 처음에 생각했을때 위와 같은 과정으로 처리하면 된다는 생각까지는 하였는데, 위와 같은 설정을 어느단계에서 해주면 되는것인지는 조금 헷갈리네요… 폼에서 POST 데이터를 받았을때 , save 하기전 is_active를 변경하는 것이 맞는것인가요? 밤늦게 죄송합니다.

    Chinseok Lee

    어떤 설정 말인가요? 유저가 회원가입할 때의 is_active 처리를 말씀하시는 건가요?

    서대원

    Chinseok Lee 네 맞습니다. superuser의 승인후 정상적인 페이지 활동이 가능할 수 있도록 설정하고 싶습니다.

    Chinseok Lee

    질문이 너무 러프합니다. 정확히 어떻게 구현을 하고 싶으신 건가요.

    UserCreationForm 을 통해 회원가입을 처리할려고 할 때, 해당 폼 처리시에 is_active 처리가 궁금하신 건가요?

    아니면, superuser 가 admin 페이지를 통해서 is_active 필드를 변경하는 것이 궁금하신 건가요.

    아니면, superuser 가 유저의 is_active 필드들을 변경할 수 있도록, 따로 뷰를 만들고 폼을 만들 때의 처리가 궁금하신 건가요?

    서대원

    이진석 아 죄송합니다 제가 구현하고자 하는 방식은 두가지 모두 해당되는것같습니다 admin페이지를 통해서 is_active 필드를 변경하는것은 가능할것같은데 회원가입폼에서 기존의 User모델의 default값으로 되어있는 is_active의 true값을 변경하는 처리가 궁금합니다

    Chinseok Lee

    UserCreationForm 을 쓰신다고 한다면.

    User is_active 필드는 디폴트값이 True 입니다.
    https://github.com/django/django/blob/master/django/contrib/auth/models.py#L330

    UserCreationForm 은 username과 password 설정만을 합니다. 나머지 필드들은 따로 지정하지 않고, save 가 됩니다.
    https://github.com/django/django/blob/master/django/contrib/auth/forms.py#L98

    그러니, UserCreationForm 을 상속처리해서, is_active=False 지정을 하실 수 있겠습니다.

    class MyUserCreationForm(UserCreationForm):
    … def save(self, commit=True):
    ……. user = super(MyUserCreationForm, self).commit(commit=False)
    ……. user.is_active = False
    ……. if commit:
    ……….. user.save()
    ……. return user

    서대원

    Chinseok Lee 아 정말 감사드립니다. 늦은시간인데 친절하게 답변해주셔 감사합니다. 늘 진석님 덕분에 많이 배우게 되는 것같습니다.
    좋은 밤되세요^^ 감사합니다.

    Donghyun Cho

    모델의 기본값을 지정할땐 특별한 이유로 생성한 폼에서만 기본값을 지정하는 경우를 제외하고는 모델에 직접 지정하는 것이 일반적입니다. 예를들면 웹폼이 하나 있는데 폼을 하나 더 추가하거나 API를 추가하려할 때 지정한 기본값을 쉽게 잊을 수 있고 다른 개발자가 정보를 받지 못한 경우에도 쉽게 빠트릴 수 있는 부분입니다.

Advertisements