13번째 줄: |
13번째 줄: |
| 일반적인 프로필 모델이라면 위 과정만으로도 구현이 끝난다. | | 일반적인 프로필 모델이라면 위 과정만으로도 구현이 끝난다. |
| | | |
− | 다만, 이번엔 여러 계정을 하나의 프로필에 엮어줄 예정이라, AbstractBaseUser를 이용하여 다음과 같은 방식으로 짜주자. 다음 문서를 참고하자. <syntaxhighlight lang="python"> | + | 다만, 이번엔 여러 계정을 하나의 프로필에 엮어줄 예정이라, AbstractBaseUser를 이용하여 다음과 같은 방식으로 짜주자. 다음 문서를 참고하자. [http://id8436.iptime.org:2786/mediawiki/index.php/%ED%9A%8C%EC%9B%90%EA%B4%80%EB%A6%AC_2._%EC%BB%A4%EC%8A%A4%ED%85%80%EC%9C%A0%EC%A0%80(AbstractUser_%EC%9D%B4%EC%9A%A9) 커스텀 유저] <syntaxhighlight lang="python"> |
| + | from django.db import models |
| + | from django.contrib.auth.models import BaseUserManager, AbstractBaseUser |
| + | |
| class User(AbstractBaseUser): | | class User(AbstractBaseUser): |
| identifier = models.CharField(max_length=20, unique=True) | | identifier = models.CharField(max_length=20, unique=True) |
| is_active = models.BooleanField(default=True) | | is_active = models.BooleanField(default=True) |
| + | is_staff = models.BooleanField(default=False) |
| is_admin = models.BooleanField(default=False) | | is_admin = models.BooleanField(default=False) |
| profile = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True, blank=True) # 연결할 프로필모델. 아래에서 정의. | | profile = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True, blank=True) # 연결할 프로필모델. 아래에서 정의. |
27번째 줄: |
31번째 줄: |
| def __str__(self): | | def __str__(self): |
| return self.identifier | | return self.identifier |
| + | |
| + | def has_module_perms(self, app_label): |
| + | '''앱 라벨을 받아, 해당 앱에 접근 가능한지 파악''' |
| + | return True |
| + | def has_perm(self, perm, obj=None): |
| + | '''권한 소지여부를 판단하기 위한 메서드''' |
| + | return True |
| </syntaxhighlight>그리고 프로필 계정은 필요에 따라 다음과 같이 짠다. User에서 참고해야 하므로 User모델보다 위에 위치하게 해주자.<syntaxhighlight lang="python"> | | </syntaxhighlight>그리고 프로필 계정은 필요에 따라 다음과 같이 짠다. User에서 참고해야 하므로 User모델보다 위에 위치하게 해주자.<syntaxhighlight lang="python"> |
| class Profile(models.Model): | | class Profile(models.Model): |
37번째 줄: |
48번째 줄: |
| email_active = models.BooleanField(default=False) # 이메일 검증여부 | | email_active = models.BooleanField(default=False) # 이메일 검증여부 |
| </syntaxhighlight>이렇게 하면 user.profile.username 같은 방식으로 프로필 속성에 접근할 수 있다. | | </syntaxhighlight>이렇게 하면 user.profile.username 같은 방식으로 프로필 속성에 접근할 수 있다. |
| + | |
| + | 이후 admin.py 등을 작성하고 관리자 계정 작성 및 로그인 하여 잘 작성되었는지 확인한다. |
| + | |
| + | === admin.py === |
| + | <syntaxhighlight lang="python"> |
| + | from django.contrib import admin |
| + | from .models import User, Profile # 직접 등록한 모델 |
| + | |
| + | @admin.register(User) |
| + | class UserAdmin(admin.ModelAdmin): |
| + | list_display = ('identifier',) |
| + | exclude = ('password',) # 사용자 상세 정보에서 비밀번호 필드를 노출하지 않음 |
| + | |
| + | @admin.register(Profile) |
| + | class UserAdmin(admin.ModelAdmin): |
| + | list_display = ('nickname',) |
| + | </syntaxhighlight> |
| | | |
| == 계정에서 프로필 생성 == | | == 계정에서 프로필 생성 == |
59번째 줄: |
87번째 줄: |
| === view 추가 === | | === view 추가 === |
| 다음과 같이 뷰를 추가한다.<syntaxhighlight lang="python"> | | 다음과 같이 뷰를 추가한다.<syntaxhighlight lang="python"> |
| + | from .models import Profile |
| + | |
| @login_required() | | @login_required() |
| def profile_create(request): | | def profile_create(request): |
− | pass | + | if request.method == "POST": |
| + | form = Profile_create_form(request.POST) |
| + | if form.is_valid(): |
| + | username = form.cleaned_data.get('identifier') # 유저아이디를 입력받는다. |
| + | raw_password = form.cleaned_data.get('password') # 패스워드를 입력받는다. |
| + | user = authenticate(username=username, password=raw_password) # 인증 진행 |
| + | if user: # 유저모델이 반환된다면.. 프로필 모델에 저장한다. |
| + | profile = Profile() |
| + | profile.username = form.cleaned_data.get('username') |
| + | profile.nickname = form.cleaned_data.get('nickname') |
| + | profile.email = form.cleaned_data.get('email') |
| + | profile = profile.save() |
| + | request.user.profile = profile # 해당 로그인한 유저의 프로필을 이 프로필로 채운다. |
| + | request.user.save() |
| + | return redirect('account:profile') |
| + | else: |
| + | form.add_error('identifier','비밀번호 혹은 아이디가 다릅니다.') # 인증이 안되면 필드에러를 발생시킨다. |
| + | else: |
| + | form = Profile_create_form() |
| + | context = {'form': form, |
| + | } |
| + | return render(request, 'account/profile_create.html', context) |
| + | |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
| === view에서 사용할 form 추가 === | | === view에서 사용할 form 추가 === |
− | <syntaxhighlight lang="python"> | + | 계정 검증을 해야하기 때문에 모델에 기반한 폼이 아니라 일반 폼으로 제작한다.<syntaxhighlight lang="python"> |
− | from .models import Profile
| + | class Profile_create_form(forms.Form): |
− | class ProfileForm(forms.ModelForm): | + | identifier = forms.CharField() |
− | class Meta: | + | password = forms.PasswordInput() |
− | model = Profile
| + | username = forms.CharField(max_length=10) |
− | fields = ['username', 'email', 'nickname']
| + | nickname = forms.CharField(max_length=10) |
| + | email = forms.EmailField() |
| </syntaxhighlight> | | </syntaxhighlight> |
| [[분류:장고 기능구현(초급)]] | | [[분류:장고 기능구현(초급)]] |