Leta Learns

django | Model Extension 본문

Django

django | Model Extension

leta 2021. 7. 18. 19:42

게시물에 작성자 연결.

작성자(user)는 여러 게시물(Blog)을 작성 가능.

게시물은 1명의 작성자에게만 연결될 수 있음.

1(작성자) : N(게시물) 관계 

 

 

blog/models.py (-> 작성자-게시물 연결)

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=models.CASCADE)

1:N or N:1관계를 표현 => N을 담당하는 테이블에 ForeignKey 설정.

원래는 writer에 user가 들어가야 하는데 기존에 작성한 코드들과의 충돌을 막기 위해 일단 새 필드를 만듦.

 

null = True

#기존에 만든 Blog 객체들은 user필드 없음.

  이 상태로 migration 진행하면 DB 내에서 충돌이 일어나므로 user필드에 null이 들어가는 것을 허용해주는 것.

 

on_delete = models.CASCADE

# 연쇄작용

 

1:1 관계는 models.OneToOneField 사용

https://docs.djangoproject.com/en/3.2/topics/db/examples/one_to_one/

 

 

model 변경 했으므로 makemigrations, migrate 해주기.

 

 

 

 

blog/views.py (-> 게시물에 user 연결)

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 %}

<p>유저: {{blog.user.username}}</p>

변수이름.user.username : 연결된 테이블의 값에 접근하는 법.

  • 변수이름 : views.py에서 받은 Blog 객체
  • 변수이름.user : Blog 객체의 user 필드 -> User 객체가 담겨있어서
  • 변수이름.user.username : username에 접근.

 

 

 

'Django' 카테고리의 다른 글

django | Pagination  (0) 2021.07.18
쿼리 스트링 Query String  (0) 2021.07.18
django | User 모델을 이용한 Signup, User 확장  (0) 2021.07.16
django | User 모델을 이용한 login, logout  (0) 2021.07.13
django | Forms  (0) 2021.07.08
Comments