홈페이지 사용자 정의¶
주의! 이 확장 튜토리얼을 진행하기 전에 첫 번째 Wagtail 사이트를 완료했는지 확인하십시오.
포트폴리오 웹사이트를 구축할 때 첫 번째 단계는 홈페이지를 설정하고 개인화하는 것입니다. 홈페이지는 훌륭한 첫인상을 남기고 포트폴리오의 핵심 메시지를 전달할 기회입니다. 따라서 홈페이지에는 다음 기능이 포함되어야 합니다:
소개: 간결한 소개는 방문자의 주의를 사로잡습니다.
전기: 자신을 소개하는 간략한 전기를 포함합니다. 이 섹션에는 이름, 역할, 전문 지식 및 고유한 자질이 언급되어야 합니다.
히어로 이미지: 전문적인 헤드샷 또는 작업을 보여주고 시각적 매력을 더하는 다른 이미지일 수 있습니다.
클릭 유도 문안(CTA): “포트폴리오 보기”, “고용하기” 또는 “더 알아보기”와 같이 방문자가 특정 작업을 수행하도록 안내하는 CTA를 통합합니다.
이력서: 교육, 경력, 성과 및 자격에 대한 요약을 제공하는 문서입니다.
이 섹션에서는 홈페이지에 기능 1부터 4까지를 추가하는 방법을 배웁니다. 이력서 또는 CV는 튜토리얼 뒷부분에서 추가할 것입니다.
이제 home/models.py 파일을 수정하여 다음을 포함합니다:
from django.db import models
from wagtail.models import Page
from wagtail.fields import RichTextField
# MultiFieldPanel 가져오기:
from wagtail.admin.panels import FieldPanel, MultiFieldPanel
class HomePage(Page):
# HomePage의 히어로 섹션 추가:
image = models.ForeignKey(
"wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
help_text="홈페이지 이미지",
)
hero_text = models.CharField(
blank=True,
max_length=255, help_text="사이트 소개 작성"
)
hero_cta = models.CharField(
blank=True,
verbose_name="히어로 CTA",
max_length=255,
help_text="클릭 유도 문안에 표시할 텍스트",
)
hero_cta_link = models.ForeignKey(
"wagtailcore.Page",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
verbose_name="히어로 CTA 링크",
help_text="클릭 유도 문안에 연결할 페이지 선택",
)
body = RichTextField(blank=True)
# content_panels 수정:
content_panels = Page.content_panels + [
MultiFieldPanel(
[
FieldPanel("image"),
FieldPanel("hero_text"),
FieldPanel("hero_cta"),
FieldPanel("hero_cta_link"),
],
heading="히어로 섹션",
),
FieldPanel('body'),
]
HomePage 모델의 다양한 부분에 이미 익숙할 것입니다. image 필드는 이미지 저장을 위한 Wagtail의 내장 이미지 모델을 참조하는 ForeignKey 입니다. 마찬가지로 hero_cta_link 는 wagtailcore.Page 에 대한 ForeignKey 입니다. wagtailcore.Page 는 Wagtail의 다른 모든 페이지 유형의 기본 클래스입니다. 즉, 모든 Wagtail 페이지는 wagtailcore.Page 에서 상속됩니다. 예를 들어, class HomePage(Page) 는 wagtailcore.Page 에서 상속됩니다.
on_delete=models.SET_NULL 을 사용하면 관리 인터페이스에서 이미지 또는 히어로 링크를 제거할 경우 홈페이지의 image 또는 hero_cta_link 필드가 null로 설정되지만 나머지 데이터는 보존됩니다. 자세한 내용은 Django 문서의 on_delete 속성을 참조하십시오.
기본적으로 Django는 모델에 ForeignKey 필드가 있을 때 모델 간에 역 관계를 생성합니다. Django는 또한 모델 이름과 _set 접미사를 사용하여 이 역 관계에 대한 이름을 생성합니다. 참조된 모델에서 ForeignKey 필드가 있는 모델에 액세스하려면 역 관계의 기본 이름을 사용할 수 있습니다.
related_name 속성을 사용하여 이 기본 명명 동작을 재정의하고 역 관계에 대한 사용자 지정 이름을 제공할 수 있습니다. 예를 들어, wagtailimages.Image 에서 HomePage 에 액세스하려면 related_name 속성에 제공한 값을 사용할 수 있습니다.
그러나 related_name="+" 를 사용하면 역 관계를 생성하지 않고 모델 간에 연결을 만듭니다. 즉, Django에게 HomePage 에서 wagtailimages.Image 에 액세스하는 방법을 만들도록 지시하지만 wagtailimages.Image 에서 HomePage 에 액세스하는 방법은 만들지 않습니다.
body 는 RichTextField 인 반면, hero_text 와 hero_cta 는 짧은 텍스트 저장을 위한 Django 문자열 필드인 CharField 입니다.
첫 번째 Wagtail 튜토리얼에서는 이미 content_panels 를 설명했습니다. FieldPanel과 MultiPanel은 Wagtail의 내장 패널 유형입니다. 둘 다 기본 패널 클래스의 서브클래스이며 자체 매개변수 외에 Wagtail의 모든 Panel 매개변수를 허용합니다. FieldPanel 은 기본 Django 모델 필드에 대한 위젯을 제공하는 반면, MultiFieldPanel 은 편집 폼의 구조를 결정하는 데 도움이 됩니다. 예를 들어, 관련 필드를 그룹화할 수 있습니다.
이제 HomePage 모델의 다양한 부분을 이해했으므로 python manage.py makemigrations 를 실행한 다음 python manage.py migrate 를 실행하여 데이터베이스를 마이그레이션합니다.
데이터베이스를 마이그레이션한 후 python manage.py runserver 를 실행하여 서버를 시작합니다.
홈페이지에 콘텐츠 추가¶
관리 인터페이스를 통해 홈페이지에 콘텐츠를 추가하려면 다음 단계를 따르십시오:
관리자 사용자 이름과 비밀번호로 관리 인터페이스에 로그인합니다.
페이지를 클릭합니다.
홈 옆의 연필 아이콘을 클릭합니다.
이미지를 선택하고, 페이지를 선택하고, 입력 필드에 데이터를 추가합니다.
참고
홈페이지 또는 블로그 인덱스 페이지를 클릭 유도 문안에 연결하도록 선택할 수 있습니다. 튜토리얼 뒷부분에서 더 적합한 페이지를 선택할 수 있습니다.
홈페이지를 게시합니다.
이제 홈페이지에 필요한 모든 데이터가 있습니다. 브라우저에서 http://127.0.0.1:8000 으로 이동하여 홈페이지를 방문할 수 있습니다. 모든 데이터를 볼 수 없죠? 데이터를 표시하려면 홈페이지 템플릿을 수정해야 하기 때문입니다.
home/templates/home/home_page.html 파일의 내용을 다음으로 바꿉니다:
{% extends "base.html" %}
{% load wagtailcore_tags wagtailimages_tags %}
{% block body_class %}template-homepage{% endblock %}
{% block content %}
<div>
<h1>{{ page.title }}</h1>
{% image page.image fill-480x320 %}
<p>{{ page.hero_text }}</p>
{% if page.hero_cta_link %}
<a href="{% pageurl page.hero_cta_link %}">
{% firstof page.hero_cta page.hero_cta_link.title %}
</a>
{% endif %}
</div>
{{ page.body|richtext }}
{% endblock content %}
홈페이지 템플릿에서 13행의 firstof 사용에 주목하십시오. 일련의 대체 옵션을 만들었고 값이 있는 첫 번째 옵션을 표시하려는 경우 이 태그를 사용하는 것이 유용합니다. 따라서 템플릿에서 firstof 템플릿 태그는 page.hero_cta 에 값이 있으면 이를 표시합니다. page.hero_cta 에 값이 없으면 page.hero_cta_link.title 을 표시합니다.
축하합니다! 포트폴리오 웹사이트의 첫 번째 단계를 완료했습니다 🎉🎉🎉.