[pinterest clone (23)] profileapp create view
웹 프로그래밍

[pinterest clone (23)] profileapp create view

728x90
반응형

views.py

 

1

createview 만들기

class ProfileCreateView(CreateView):
    model = Profile
    context_object_name = 'target_profile'
    form_class = ProfileCreationForm
    success_url = reverse_lazy('accountapp:hello_world')
    template_name = 'profileapp/create.html'

2

profileapp/templates/profileapp/createview 만들기

{% extends 'base.html'%}
{% load bootstrap4 %}

{% block content %}

    <div style="text-align: center; max-width: 500px; margin: 4rem auto">
        <div class="mb-4">
            <h4>Profile Create</h4>
        </div>
        <form action="{% url 'profileapp:create' %}" method="post">
            {% csrf_token %}
            {% bootstrap_form form %}
            <input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
        </form>
    </div>

{% endblock %}

3

urls.py 설정

from django.urls import path

from profileapp.views import ProfileCreateView

app_name = 'profileapp'

urlpatterns = [
    path('create/', ProfileCreateView.as_view(), name='create'),
]

4

http://127.0.0.1:8000/profiles/create/ 접속해보면 잘 나온다

 

5

프로필 없으면 프로필 생성창 링크를 주도록 accountapp/detail.html 수정

{% extends 'base.html' %}

{% block content %}

<div>
    <div style="text-align: center; max-width: 500px; margin: 4rem auto;">
        <p>
            {{ target_user.date_joined }}
        </p>
        {% if target_user.profile %}
        <h2 style="font-family: 'NanumSquareB'">
            {{ target_user.profile.nickname}}
        </h2>
        {% else %}
        <a href="{% url 'profileapp:create' %}">
            <h2 style="font-family: 'NanumSquareB'">
                Create Profile
            </h2>
        </a>
        {% endif %}
        {% if target_user == user %}
        <a href="{% url 'accountapp:update' pk=user.pk %}">
            <p>
                Change Info
            </p>
        </a>
        <a href="{% url 'accountapp:delete' pk=user.pk %}">
            <p>
                Quit
            </p>
        </a>
        {% endif %}
    </div>
</div>

{% endblock %}

 

6

이미지를 넣어도 This field is required 나타난다.

이유는 create.html에서 form에 enctype을 명시하지 않았기때문이다. 

<form action="{% url 'profileapp:create' %}" method="post" enctype="multipart/form-data">

 

7

이번엔 profile에 user.id가 없다함

이유:

models.py에

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    image = models.ImageField(upload_to='profile/', null=True)
    nickname = models.CharField(max_length=20, unique=True, null=True)
    message = models.CharField(max_length=100, null=True)

user라는 필드가 있음에도 

forms.py에 필드는

class ProfileCreationForm(ModelForm):
    class Meta:
        model = Profile
        fields = ['image', 'nickname', 'message'] #user는 서버에서 처리해줄것

등록하지 않았었다. 왜냐면 자기 프로필이 아닌데 남의 프로필을 만들어줄수 있는 가능성이 있으니까 서버내에서 구현하기로 했었다.

 

views.py

class ProfileCreateView(CreateView):
    model = Profile
    context_object_name = 'target_profile'
    form_class = ProfileCreationForm
    success_url = reverse_lazy('accountapp:hello_world')
    template_name = 'profileapp/create.html'

    def form_valid(self, form):
        temp_profile = form.save(commit=False)
        temp_profile.user = self.request.user
        temp_profile.save()
        return super().form_valid(form)

forms.py에서 만든 데이터는 form에 들어있는데 temp_profile에 임시저장한다. commit=False로 줌으로써 db에 저장하지는 않는다. 그래서 보낸 3가지 데이터(image,nickname,message)는 있는데 user는 아직 없는것.

따라서 temp_profile의 user를 request를 보낸 당사자의 user로 정해준다. (temp_profile.user = self.request.user)

그리고 나서 db에 세이브. 

 

ㄲ ㅡ ㅌ

728x90
반응형