이번엔 게시물에 작성자를 연결해보자.
DB(모델)을 구성할 때는 바로 작성하는 것이 아니라, 구조를 정확히 파악하고 설계를 한 이후에 작성해야한다.
그렇지 않으면 이미 삽입된 내용에 새로운 열을 추가하는 것이므로, 충돌이 일어날 수 있다.
1(유저) : N(게시물)
의 관계라고 볼 수 있다.from django.db import models
from account.models import CustomUser
# Create your models here.
class Blog(models.Model):
user = models.ForeignKey(CustomUser, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
writer = models.CharField(max_length=10)
pub_date = models.DateTimeField()
body = models.TextField()
image = models.ImageField(upload_to="blog/", blank=True, null=True)
def __str__(self):
return self.title
def summary(self):
return self.body[:100]
user = models.ForeignKey(CustomUser, null = True, on_delete = model.CASCADE)
원래는 writer에 user가 들어가지만, 기존 작성 코드와의 충돌을 피하기 위해 새로운 필드를 하나 만들었다.
on_delete=models.CASCADE
1:1
관계는 어떻게 설정??
모델을 변경했으면 꼭 makemigrations
, migrate
를 해주자.
blog/views.py
def create_with_django_form(request):
form = BlogForm(request.POST, request.FILES)
if form.is_valid():
new_blog = form.save(commit=False)
new_blog.pub_Date = timezone.now()
if request.user.is_authenticated:
new_blog.user = request.user
new_blog.save()
return redirect('blog:detail', new_blog.id)
return redirect('home')
new_blog.user = request.user
: Blog에 있었던 user 필드를 request.user, 즉 현재 로그인 된 User 객체로 연결한다.blog/templates/detail.html
{% extends 'base.html' %}
{% block content %}
<h1>{{ blog.title }}</h1>
<p>유저: {{blog.user.username}}</p>
<p>{{ blog.pub_date }}</p>
<p>{{ blog.body }}</p>
{% if blog.image %}
<img src="{{blog.image.url}}" alt="" />
{% endif %}
<a href="{% url 'blog:update' blog.id %}">수정하기</a>
<a href="{% url 'home' %}">돌아가기</a>
<a href="{% url 'blog:delete' blog.id%}">Delete Post</a>
{% endblock %}
변수이름.user.username
: 연결된 테이블의 값을 접근하는 방법은 똑같다.변수이름
: views에서 받은 Blog 객체변수이름.user
: Blog 객체의 user 필드 -> User 객체가 담겨있음변수이름.user.username
: username을 접근할 수 있다.게시물 - 댓글
관계 생각해보기누가 작성했는지
어느 게시물에 작성하는지
무슨 내용인지