앱 등록 할 때
Config을 적을 때와 app이름을 적을 때가 있다.
Config은 클래스명을 등록.
app 이름은 클래스의 이름을 등록.
결국 둘 다 같은 클래스를 등록한다는 뜻이다.
makemigrations, migrate
grations는 테이블 작업을 위한 작업 파일 생성.
grate은 테이블을 생성한다.
모델로 인스턴스를 만들어보자.
셸을 키고, 모델과 필드에 필요한 기능을 임포트하고, 클래스의 속성들을 입력하고 인스턴트를 생성한다.
셸을 키고!
python manage.py shell
셸을 사용하기 위한 명령어.
모델과 필드에 필요한 기능을 임포트하고!
from pybo.models import Question, Answer
from django.utiils import timezone
클래스의 속성들을 입력한다.
q = Question(subject = '파이보가 뭐야?', content='파이보를 알고싶어', create_date=timezone.now())
인스턴스를 생성한다.
q.save()
각 속성의 값을 불러올 수 있다.
q.id, q.subject, q.content, q.create_date
def __str__(self)
return self.(속성)
q를 불러오면 Question의 객체라고 나온다.
하지만 str을 사용해주면 q의 속성으로 값을 가져올 수 있다.
모델에 메서드가 추가 될 때는 mi..할 필요없다.
모델의 속성이 바뀌었을 때 만 해주면 된다.
Question 객체를 하나 씩 보자.
모든 객체를 다 가져오고, filter로, get으로, __로 특정 문자로 가져와 보자.
모든 객체를 다 가져오고!
Question.objects.all()
filter로 가져오고!
Question.objects.filter(id=1)
filter는 리스트로 가져온다.
get으로 가져오고!
Question.objects.get(id=1)
get은 객체를 가져온다.
특정 하나를 가져온다. 데이터가 없다면 오류 발생.
Question.objects.filter(subject__contains='pybo')
Question을 수정해보자.
수정할 객체를 불러오고, 수정을 하고, 저장을 한다.
수정할 객체를 불러온고!
q = Question.objects.get(id=1)
수정하고!
q.subjects = '장고는 무엇인가요?'
저장을 한다!
q.save()
Question 삭제해보자.
삭제할 객체를 불러오고, 객체를 삭제한다
객체를 불러온다.
q = Question.objects.get(id=1)
객체를 삭제한다.
q.delete()
!!에러!!
객체를 삭제해서 하나 더 만들려고 했는데 자꾸 에러가 난다.
Question이 정의 되어지지 않았다는 에러.
뭘까... 바로 __str__을 쓰고 셀을 다시 켯으니 import를 다시 해줘야 했던 것이었다...
해결!
Answer를 작성하자!
question을 변수에 담고. Answer를 생성하자.
q = question.objects.get(id=1)
Answer를 생성하자.
a = Answer(question=q, content='안녕~', create_date=timezone.now())
Answer를 조회하자!
Answer를 조회하고, 속성도 보고, 역참조도 해보자.
Answer를 조회하고!
Answer.objects.get(id=1)
속성을 보자!
a.question
역참조 해보자!
q.answer_set.all()
**역참조 정리**
질문과 답변은 1:N의 관계다.
즉 외래키를 가져오는 쪽에서 조회를 하는 것은 참조.
외래키를 주는 쪽에서 조회를 한다면 역참조다.
_set은 related_name 이름을 붙여주지 않는 이상 디폴드 값이다.
관리자 페이지에 모델 검색 만들기.
기능 속성을 받을 클래스를 만들고(상속이 중요), 속성을 추가하고, admin에 등록해준다.
클래스를 만든다.!
class QuestionAdmin(admin.ModelAdmin):
속성을 추가하고!
search_fields = ['subject']
admin에 등록해준다.
admin.site.register(Question, QuestionAdmin)
!!에러!!
데이터를 보내려고 했는데 에러가 나온다!
왜일까..
중괄호인데 대괄호를 사용했다!
딕셔너리 형태로 보낸다는 것을 기억하자!
**상세보기 매핑**
html= href='pybo/{{question.id}}'
urls = path('<int:question_id>/', views.detail)
이 둘의 관계가 뭘로 이어져 있다 의문이었다.
같은 이름으로 이어져 있는 것을 찾으려니 항상 이해가 안되었다.
question.id와 question_id는 이름이 다른데 어떻게 이어지지? 로 생각했다.
간단히 생각해보자.
html에서 가져온게 pybo/1이다. 하면
url에서는 1이라는 것을 question_id로 정의를 한 것이다.
view에서는 그것을 받아서 같은 id의 데이터를 보여주는 것이고.
오류페이지
get_object_or 404를 임포트 해주고, 객체를 가져온다.!
객체를 가져오든지, 아니면 404 라는 뜻이지!
임포트 해준다!
from django.shortcuts import render, ger_object_404
객체를 가져온다!
question = get_object_404(Question, pk=question_id)
템플릿에 URL 별칭 사용하기.(하드코딩 피하기 위함이다.)
템플릿에 각 url에 urls에 적었던 이름을 적어주고 인수 값은 그대로 적어준다.
전달 해줘야하는 파라미터의 이름을 적어서 보내주는게 이해하기가 편하다.
{%url 'detail' question_id = question.id%} 이런식으로! 이해가 잘 되네!!
네임스페이스를 추가해주면 별칭이 겹쳐도 겹치지 않는다..에?
urls에는 app_name = 'pybo'
html에서는 {%url 'pybo:detail' question_id=question.id%}
데이터 저장
답변등록 폼 작성으로 데이터를 보내고,
url에서 id를 받고 함수로 이어준다.
함수에서 데이터를 저장 해준다.
save(commit=False) 왜 사용하나요?
한줄요약 : commit=False를 하게 되면 데이터베이스에 당장 저장하지 않는다.
후에 작업을 더 하기 위해 사용한다.
폼
페이지 요청 시 전달 되는 파라미터들을 쉽게 관리하기 위해 사용.
필수 파라미터 값 누락 확인, 형식 검증 등 목적으로 사용.
html을 자동으로 생성하거나, 폼에 연결된 모델을 이용해 데이터 저장하는 기능.
일반 폼과 모델 폼이 있다.
모델 폼은 모델과 연결된 폼. 열결된 모델의 데이터를 저장 할 수 있는 폼이다.
모델 폼은 Meta 클래스가 반드시 필요. Meta에는 사용할 모델과 속성을 적어야 한다.
폼 임포트를 하고, 모델을 임포트 하고, 클래스를 만들고, Meta를 만들고, 모델과 속성을 리스트로 적어준다.
from django import forms
from .models import Question
class QuestionForm(Forms.ModelForm):
class Meta:
model = Question
fields = ['subject', 'content']
폼을 이용해서 view함수 작성을 해보자.
사용할 폼을 임포트하고, 함수를 만들고, 폼을 사용하고,폼 데이터를 보낸다.
아마도 form.as_p가 그 데이터를 받는 듯 허다.
from .forms import Questionform
def question_create(request):
form = QuestionForm()
return render(request, 'pybo/question_list.html', {'form':form})
**action**
action에 url을 따로 적지 않으면 현재 url이 디폴트값으로 설정 된다.
작성도 하고 수정도 해야하는 현재 상태에서는 디폴트로 하면 된다.
'점프 투 장고~' 카테고리의 다른 글
2장 : 장고 기본 요소 익히기. (0) | 2023.04.17 |
---|---|
1장 : 장고 개발 준비. (0) | 2023.04.11 |