일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 최소스패닝트리
- django
- 소프트웨어공학
- 장고
- 데이터베이스
- BFS
- 함밥
- 마라마라빔
- 백트래킹
- codetree
- Bellman-Ford
- 코드트리
- Kruskal
- 백준
- 종합설계
- 알고리즘
- 동적계획법
- 그리디알고리즘
- DFS
- SQL
- 프로그래머스
- B대면노래방
- DP
- MyPlaylist
- 모각코
- 실습
- 파이썬
- programmers
- Planned
- minimum spanning tree
- Today
- Total
Leta Learns
django | Model Extension 본문
게시물에 작성자 연결.
작성자(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 |