2022-11-16 ~ 2022-11-21
http://kdt.pythonanywhere.com/
urlpatterns = [
path("signup/", views.signup, name="account_signup"),
path("login/", views.login, name="account_login"),
path("logout/", views.logout, name="account_logout"),
path(
"password/change/",
views.password_change,
name="account_change_password",
),
path("password/set/", views.password_set, name="account_set_password"),
path("inactive/", views.account_inactive, name="account_inactive"),
# E-mail
path("email/", views.email, name="account_email"),
path(
"confirm-email/",
views.email_verification_sent,
name="account_email_verification_sent",
),
re_path(
r"^confirm-email/(?P<key>[-:\w]+)/$",
views.confirm_email,
name="account_confirm_email",
),
# password reset
path("password/reset/", views.password_reset, name="account_reset_password"),
path(
"password/reset/done/",
views.password_reset_done,
name="account_reset_password_done",
),
re_path(
r"^password/reset/key/(?P<uidb36>[0-9A-Za-z]+)-(?P<key>.+)/$",
views.password_reset_from_key,
name="account_reset_password_from_key",
),
path(
"password/reset/key/done/",
views.password_reset_from_key_done,
name="account_reset_password_from_key_done",
),
]- (추후)
- 접근 제어 코드 리팩터링하기(views.py 에서 중복되는 mixin을 따로 모듈로 생성하여 활용)
- 로그인만 필요 : LoginRequiredmMixin
- 로그인 + 이메일 인증 (레시피 작성, 댓글 작성, 좋아요, 팔로우)
- 로그인 + 오브젝트 (레시피 수정, 레시피 삭제, 댓글 수정 삭제)
# settings.py
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"cheers.middleware.ProfileSetupMiddleware",
]장고공식문서 SimpleMiddleware를 참조
from django.urls import reverse
from django.shortcuts import redirect
class ProfileSetupMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
if (
request.user.is_authenticated and
not request.user.nickname and
request.path_info != reverse('profile-setting')
):
return redirect("profile-setting")
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response- Django는 관리자 페이지를 제공해주기 때문에 편리한만큼 조금의 추가 설정만 해주면 한데 모아 각 모델별 오브젝트들을 관리할 수 있다.
class UserInline(admin.StackedInline):
model = User.following.through
fk_name = 'to_user'
verbose_name = 'Follower'
verbose_name_plural = 'Followers'
class CommentInline(admin.StackedInline):
model = Comment
# GenericForeignKey를 통해 관계를 맺고 있는것은 StackedInline을 못쓴다.
# class LikeInline(admin.StackedInline):
# model = Like
class LikeInline(GenericStackedInline):
model = Like
class RecipeAdmin(admin.ModelAdmin):
inlines = (
CommentInline,
LikeInline,
)
class CommentAdmin(admin.ModelAdmin):
inlines = (
LikeInline,
)
class ProductAdmin(admin.ModelAdmin):
inlines = (
LikeInline,
)
admin.site.register(User, UserAdmin)
admin.site.register(Recipe, RecipeAdmin)
admin.site.register(Comment, CommentAdmin)
admin.site.register(Like)
admin.site.register(Product,ProductAdmin)
# User모델의 추가 필드는 admin 페이지에 따로 나오지 않기 때문에 설정을 해줘야한다.
UserAdmin.fieldsets += (("Custom fields", {"fields": ("nickname", "profile_pic", "introduce", "following")}),)
UserAdmin.inlines = (UserInline,)


