SteadyDrills

장고 프로젝트(: spartamaket) - 프로필 이미지 삽입기능 & 기본값(default) 본문

웹개발

장고 프로젝트(: spartamaket) - 프로필 이미지 삽입기능 & 기본값(default)

Drills 2024. 8. 27. 00:09

240826

장고 프로젝트(: spartamaket) - 프로필 이미지 삽입기능 & 이미지 기본값(default)

 

 

 

오늘 구현한 기능 부분 중 가장 큰 부분은 이미지 삽입기능과 기본값 설정이다.

class CustomUserCreationForm(UserCreationForm):
    image = forms.ImageField(label="Profile Image",required=False)

    class Meta:
        model = get_user_model()
        fields = ("username", "password1", "password2", "image")


class CustomUserChangeForm(UserChangeForm):
    username = forms.CharField()
    image = forms.ImageField(label="Profile Image",required=False)
    
    class Meta:
        model = User
        fields = ('username', 'image',)

 

 

구조를 생각 못하고 우선적으로 폼에 이미지 삽입 필드만을 만들었다.

그러자 이미지를 넣고 회원가입을 해도 이미지를 삽입하는 것은 필수라며, 다시 기입하라고 했다...

 

 

3번을 시도해도 안되자 답답하지만 볼 수 있는 건  VScode의 DB 밖에 없다 보니 더 자세히 보게 되었다. 자세히 보다 보니 이미지가 저장이 안 돼있는 걸 보고 코드 전체를 다시 볼 생각을 했다. DB에 저장은 결국 모델이 하는 일이고 이미지라는 컬럼을 만들기 위해 오버라이딩을 하면 된다라는 결론이 나왔다. 

class User(AbstractUser):
    image = models.ImageField(default='user.png', upload_to='images/users', blank=True)
    following = models.ManyToManyField(
        "self", symmetrical=False, related_name="followers"

 

그와 동시에 과제의 필수 기능 중 하나인 기본값을 설정했다. 이렇게만 하면 바로바로 잘 나올 줄 알았으나 또한 가지를 빼먹은 것은 이미지를 전송하는 코드를 추가하지 않았다는 것이다. ;;

require_http_methods(['GET', 'POST'])
def signup(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST, request.FILES) #repquest.FILES를 빼먹다니....
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('accounts:login')
    else:
        form = CustomUserCreationForm()
    context = {'form': form}
    return render(request, 'accounts/signup.html', context)

 

코드를 보며 '내가 기입한 요청을 받아라' 하고 보냈지만 '내가 올린 이미지'에 대한 요청을.... 빼먹었다.

하지만 결국 찾아냈고 그 덕에 장고의 메커니즘이나 로직을 더 잘 이해하게 된 거 같아 기분이 좋다.

많이 부딪혀보니 잘 이해가지 않던 것도 이해하게 되어 오류를 대하는 방식이 '새로운 문제를 푸는', '장고의 기능을 이해'하게 되는 계기가 되어 좋았다.