hyeonga_code

파이선 웹구축_장고_22_댓글_상속 테이블 본문

Python_Django

파이선 웹구축_장고_22_댓글_상속 테이블

hyeonga 2023. 6. 14. 05:59
반응형

- 상속 테이블

1. 장고 실행

2.앱 생성

3. 상속 클래스 테이블 생성 <acc> > 'models.py'

'models.py'

=====

1
2
3
4
5
6
7
8
9
10
from django.db import models
 
# Create your models here.
class Board(models.Model):
    subject = models.CharField(max_length=100)
    writer = models.CharField(max_length=100)
    content = models.TextField()
 
    def __str__(self):
        return f"{self.writer} 가 작성한 {self.subject}"
cs

갑자기 보드를 참조하게 됨

보드는 리플라이에게 역참조지시자를 사용하여 불러올 수 있음

자식클래스(소문자)_set로 가져오면 됨

"reply_set"

b.reply_set.all() 형식

 

 

>> 마이그레이션 > 오류

'''

TypeError: ForeignKey.__init__() missing 1 required positional argument: 'on_delete'

'''

 

'''

- 수정

board = models.ForeignKey(Board, on_delete=models.CASCADE)

#_ 1이 사라졌을 때 N도 사라지게 설정하는 것

'''

 

 

'models.py' 수정

=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.db import models
 
class Board(models.Model):
    subject = models.CharField(max_length=100)
    writer = models.CharField(max_length=100)
    content = models.TextField()
 
    def __str__(self):
        return f"{self.writer} 가 작성한 {self.subject}"
    
    
class Reply(models.Model):
    board = models.ForeignKey(Board, on_delete=models.CASCADE)
    #_ 1이 사라졌을 때 N도 사라지게 설정하는 것
    replyer = models.CharField(max_length=100)
    comment = models.TextField()
    
    def __str__(self):
        return f"{self.board}_{self.replyer}"
cs

 

 

 

 

4. 계정 연결

'admin.py'

=====

1
2
3
4
5
from django.contrib import admin
from .models import Board, Reply
 
admin.site.register(Board)
admin.site.register(Reply)
cs

 

>> /admin/ 사이트 접속 > 직접 작성하는 것이 아니라 board의 테이블을 가져와서 사용하게 됨

 

 

 

5. 경로 설정

'urls.py'

=====

1
2
3
4
5
6
7
8
from django.urls import path
from . import views
 
urlpatterns = [
    path('index/', views.index, name="index"),
    path('detail/<bpk>', views.detail, name="detail"),
    path('delete/<bpk>', views.delete, name="delete"),
]
cs

 

 

 

6. 함수 설정

'views.py'

=====

1
2
3
4
5
6
7
8
9
10
11
from .models import Board, Reply
 
def detail(request, bpk):
    b = Board.objects.get(id=bpk)
    r = b.reply_set.all()
    #_ 붙어있는 모든 정보 불러오기
    context = {
        "b" : b,
        "rset" : r
    }
    return render(request, "board/detail.html", context)
cs

 

 

 

6. 상세페이지 작성

'detail.html'

=====

1
2
3
4
5
6
7
8
9
10
11
12
13
<h1><b>{{ b.subject }}</b></h1>
<h4>written by <b>{{b.writer}}</b></h4>
 
<textarea cols="60" rows="6" disabled>{{ b.content }}</textarea><br><br>
 
<a href="{% url 'index' %}"><button></button></a>
 
<hr>
{% for i in rset %}
    <b>{{ i.replyer }}</b> {{ i.comment }} <br>
{% empty %}
    댓글을 달아주세요
{% endfor %}
cs

 

반응형