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
반응형
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (25)] get_success_url 함수와 리팩토링 (0) | 2021.04.30 |
---|---|
[pinterest clone (24)] profileapp update view (0) | 2021.04.30 |
[pinterest clone (22)] ModelForm (0) | 2021.04.30 |
[pinterest clone (21)] superuser, media 관련설정 (0) | 2021.04.30 |
반응형 플러그인 모음 (0) | 2021.04.28 |