Skip to content

Commit 3ce5683

Browse files
authored
Merge pull request #36 from pirogramming/dev
[Feat] 로그인 기능 완료 및 메인 페이지 html 구현 완료
2 parents 075e5c4 + 0725b38 commit 3ce5683

File tree

21 files changed

+720
-56
lines changed

21 files changed

+720
-56
lines changed

accounts/adapters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from allauth.account.adapter import DefaultAccountAdapter
2+
3+
class CustomAccountAdapter(DefaultAccountAdapter):
4+
def get_signup_redirect_url(self, request):
5+
request.session["just_signed_up"] = True
6+
return "/accounts/profile/"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 5.2.4 on 2025-08-07 06:01
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('accounts', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='userprofile',
15+
name='nickname',
16+
field=models.CharField(max_length=30),
17+
),
18+
migrations.AlterField(
19+
model_name='userprofile',
20+
name='profile_image_url',
21+
field=models.TextField(blank=True, null=True),
22+
),
23+
migrations.AlterField(
24+
model_name='userprofile',
25+
name='user_age',
26+
field=models.IntegerField(blank=True, null=True),
27+
),
28+
migrations.AlterField(
29+
model_name='userprofile',
30+
name='user_gender',
31+
field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')], max_length=10, null=True),
32+
),
33+
]

accounts/models.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33

44
class UserProfile(models.Model):
55
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
6-
nickname = models.CharField(max_length=10)
7-
user_gender = models.CharField(max_length=10, choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')])
8-
user_age = models.IntegerField()
9-
profile_image_url = models.TextField()
6+
nickname = models.CharField(max_length=30)
7+
user_gender = models.CharField(
8+
max_length=10,
9+
choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')],
10+
null=True, # DB에 null 허용
11+
blank=True)
12+
user_age = models.IntegerField(null=True, blank=True)
13+
profile_image_url = models.TextField(null=True, blank=True)
1014

1115
def __str__(self):
1216
return self.nickname

accounts/signals.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
@receiver(post_save, sender=User)
77
def create_user_profile(sender, instance, created, **kwargs):
88
if created: # 새 User가 생성된 경우
9-
UserProfile.objects.create(
10-
user=instance,
11-
nickname=instance.username or "새 유저",
12-
user_gender="M", # 기본값 (원하면 "F" 또는 None도 가능)
13-
user_age=20, # 기본값
14-
profile_image_url="default.png"
15-
)
9+
UserProfile.objects.create(
10+
user=instance,
11+
nickname=instance.username or "새 유저",
12+
user_gender=None,
13+
user_age=None,
14+
profile_image_url=None
15+
)

accounts/templates/accounts/profile.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
if (response.ok) {
145145
alert('프로필이 성공적으로 업데이트되었습니다.');
146146
// 성공 시 리다이렉트 또는 다른 처리
147+
window.location.href = '/';
147148
} else {
148149
alert(result.error || '오류가 발생했습니다.');
149150
}

accounts/urls.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
from . import views
33

44
urlpatterns = [
5-
path('login/', views.basic_login, name='basic_login'),
65
path('signup/', views.signup, name='signup'),
76
path('profile/', views.profile, name='profile'),
8-
path('check-nickname/', views.check_nickname, name='check_nickname'),
7+
#path('check-nickname/', views.check_nickname, name='check_nickname'),
98
]

accounts/views.py

Lines changed: 62 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,83 @@
1-
from django.http import JsonResponse
2-
from django.views.decorators.csrf import csrf_exempt
3-
4-
@csrf_exempt
5-
def basic_login(request):
6-
if request.method == "POST":
7-
# 로그인 로직 작성
8-
return JsonResponse({"message": "기본 로그인 성공"})
9-
return JsonResponse({"error": "Invalid request"}, status=400)
10-
11-
@csrf_exempt
12-
def signup(request):
13-
if request.method == "POST":
14-
# 회원가입 로직 작성
15-
return JsonResponse({"message": "회원가입 성공"})
16-
return JsonResponse({"error": "Invalid request"}, status=400)
17-
18-
import json
19-
from django.http import JsonResponse
201
from django.views.decorators.csrf import csrf_exempt
212
from django.contrib.auth.decorators import login_required
22-
from django.shortcuts import render
3+
from django.shortcuts import render, redirect
4+
from django.http import JsonResponse
5+
from .models import UserProfile
6+
237

248
@csrf_exempt
259
@login_required
2610
def profile(request):
2711
if request.method == "GET":
28-
# profile.html 렌더링
29-
return render(request, 'accounts/profile.html', {
30-
"user": request.user,
31-
"profile": getattr(request.user, "profile", None)
32-
})
12+
if request.session.get("just_signed_up", False):
13+
request.session["just_signed_up"] = False
14+
return render(request, 'accounts/profile.html', {
15+
"user": request.user,
16+
"profile": request.user.profile,
17+
})
18+
return redirect("/")
3319

20+
elif request.method == "POST":
21+
try:
22+
profile = request.user.profile
23+
24+
profile.nickname = request.POST.get("nickname")
25+
profile.user_gender = request.POST.get("user_gender")
26+
profile.user_age = request.POST.get("user_age")
27+
# 프로필 이미지 URL은 추후 파일 업로드 처리 방식에 따라 별도 처리 가능
28+
profile.save()
29+
30+
return JsonResponse({"message": "회원 정보 수정 성공", "redirect": "/"})
31+
except Exception as e:
32+
return JsonResponse({"error": str(e)}, status=400)
33+
34+
return JsonResponse({"error": "Invalid request"}, status=400)
35+
36+
37+
@csrf_exempt
38+
def signup(request):
3439
if request.method == "POST":
3540
try:
3641
data = json.loads(request.body)
37-
profile = request.user.profile
3842

39-
profile.nickname = data.get("nickname")
40-
profile.user_gender = data.get("user_gender")
41-
profile.user_age = data.get("user_age")
42-
profile.profile_image_url = data.get("profile_image_url")
43+
username = data.get("username")
44+
email = data.get("email")
45+
password = data.get("password")
46+
nickname = data.get("nickname")
47+
gender = data.get("user_gender")
48+
age = data.get("user_age")
49+
50+
# 중복 체크
51+
if User.objects.filter(username=username).exists():
52+
return JsonResponse({"error": "이미 존재하는 아이디입니다."}, status=400)
53+
if UserProfile.objects.filter(nickname=nickname).exists():
54+
return JsonResponse({"error": "이미 존재하는 닉네임입니다."}, status=400)
55+
56+
# User 생성 및 프로필 설정
57+
user = User.objects.create_user(username=username, email=email, password=password)
58+
profile = user.profile
59+
profile.nickname = nickname
60+
profile.user_gender = gender
61+
profile.user_age = age
62+
profile.profile_image_url = data.get("profile_image_url", "default.png")
4363
profile.save()
4464

45-
return JsonResponse({
46-
"message": "회원 정보 수정 성공",
47-
"user_id": request.user.id,
48-
"nickname": profile.nickname,
49-
"user_gender": profile.user_gender,
50-
"user_age": profile.user_age,
51-
"profile_image_url": profile.profile_image_url,
52-
"user_email": request.user.email,
53-
})
65+
# 로그인 처리 및 플래그 설정
66+
login(request, user)
67+
request.session["just_signed_up"] = True
68+
69+
return redirect("/accounts/profile/")
5470
except Exception as e:
5571
return JsonResponse({"error": str(e)}, status=400)
5672

5773
return JsonResponse({"error": "Invalid request"}, status=400)
5874

75+
'''
5976
def check_nickname(request):
6077
nickname = request.GET.get("nickname")
61-
if nickname == "abc": # 예시
62-
return JsonResponse({"available": False})
63-
return JsonResponse({"available": True})
78+
if not nickname:
79+
return JsonResponse({"error": "닉네임이 필요합니다."}, status=400)
80+
81+
exists = UserProfile.objects.filter(nickname=nickname).exists()
82+
return JsonResponse({"available": not exists})
83+
'''

config/settings.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
'accounts',
4949
'diets',
5050
'foods',
51+
'main',
5152
]
5253

5354
SITE_ID = 1
@@ -57,9 +58,11 @@
5758
'allauth.account.auth_backends.AuthenticationBackend',
5859
]
5960

60-
LOGIN_REDIRECT_URL = '/accounts/profile/'
61+
LOGIN_REDIRECT_URL = '/'
6162
LOGOUT_REDIRECT_URL = '/accounts/login/'
63+
ACCOUNT_SIGNUP_REDIRECT_URL = '/accounts/profile/'
6264
ACCOUNT_LOGOUT_ON_GET = True
65+
ACCOUNT_ADAPTER = "accounts.adapters.CustomAccountAdapter"
6366

6467
MIDDLEWARE = [
6568
'django.middleware.security.SecurityMiddleware',

config/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
urlpatterns = [
2222
path('admin/', admin.site.urls),
23+
path('', include('main.urls')),
2324
path('accounts/', include('allauth.urls')),
2425
path('accounts/', include('accounts.urls')),
2526
path('diets/', include('diets.urls')),
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# Generated by Django 5.2.4 on 2025-08-07 06:01
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('foods', '0002_alter_food_food_id'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='food',
15+
name='VitaminA',
16+
field=models.FloatField(blank=True, null=True),
17+
),
18+
migrations.AlterField(
19+
model_name='food',
20+
name='VitaminB',
21+
field=models.FloatField(blank=True, null=True),
22+
),
23+
migrations.AlterField(
24+
model_name='food',
25+
name='VitaminC',
26+
field=models.FloatField(blank=True, null=True),
27+
),
28+
migrations.AlterField(
29+
model_name='food',
30+
name='VitaminD',
31+
field=models.FloatField(blank=True, null=True),
32+
),
33+
migrations.AlterField(
34+
model_name='food',
35+
name='VitaminE',
36+
field=models.FloatField(blank=True, null=True),
37+
),
38+
migrations.AlterField(
39+
model_name='food',
40+
name='calcium',
41+
field=models.FloatField(blank=True, null=True),
42+
),
43+
migrations.AlterField(
44+
model_name='food',
45+
name='calorie',
46+
field=models.FloatField(),
47+
),
48+
migrations.AlterField(
49+
model_name='food',
50+
name='carbohydrate',
51+
field=models.FloatField(),
52+
),
53+
migrations.AlterField(
54+
model_name='food',
55+
name='cholesterol',
56+
field=models.FloatField(blank=True, null=True),
57+
),
58+
migrations.AlterField(
59+
model_name='food',
60+
name='dietary_fiber',
61+
field=models.FloatField(blank=True, null=True),
62+
),
63+
migrations.AlterField(
64+
model_name='food',
65+
name='fat',
66+
field=models.FloatField(),
67+
),
68+
migrations.AlterField(
69+
model_name='food',
70+
name='iron_content',
71+
field=models.FloatField(blank=True, null=True),
72+
),
73+
migrations.AlterField(
74+
model_name='food',
75+
name='moisture',
76+
field=models.FloatField(),
77+
),
78+
migrations.AlterField(
79+
model_name='food',
80+
name='phosphorus',
81+
field=models.FloatField(blank=True, null=True),
82+
),
83+
migrations.AlterField(
84+
model_name='food',
85+
name='potassium',
86+
field=models.FloatField(blank=True, null=True),
87+
),
88+
migrations.AlterField(
89+
model_name='food',
90+
name='protein',
91+
field=models.FloatField(),
92+
),
93+
migrations.AlterField(
94+
model_name='food',
95+
name='salt',
96+
field=models.FloatField(blank=True, null=True),
97+
),
98+
migrations.AlterField(
99+
model_name='food',
100+
name='saturated_fatty_acids',
101+
field=models.FloatField(blank=True, null=True),
102+
),
103+
migrations.AlterField(
104+
model_name='food',
105+
name='serving_size',
106+
field=models.FloatField(blank=True, null=True),
107+
),
108+
migrations.AlterField(
109+
model_name='food',
110+
name='sugar',
111+
field=models.FloatField(blank=True, null=True),
112+
),
113+
migrations.AlterField(
114+
model_name='food',
115+
name='trans_fatty_acids',
116+
field=models.FloatField(blank=True, null=True),
117+
),
118+
migrations.AlterField(
119+
model_name='food',
120+
name='weight',
121+
field=models.FloatField(),
122+
),
123+
]

0 commit comments

Comments
 (0)