기존에 게시글은 모든 컨텐츠를 보여준다. 이 때의 문제점은 게시글이 엄청 길면 그것을 다 보여준다는 것.
이를 일정 조건을 걸어 조금만 보여줄 수 있도록 하는 문법이있다.
<p class="card-text">{{ p.content | truncatewords:50 }}</p>
<p class="card-text">{{ p.content | truncatechars:50 }}</p>
truncatewords는 단어 수, truncatechars는 글자 수 만큼만 보여준다
또, 게시글의 요약 느낌이 나도록 추가할 수 있다.
models.py
class Post(models.Model):
hook_text = models.CharField(max_length=100, blank=True)
post_list.html
{% if p.hook_text %}
<h5 class="text-muted"> {{ p.hook_text }} </h5>
{% endif %}
text-muted는 글씨를 조금 흐릿하게 해서 원래 제목과 구별할 수 있도록 한다.
템플릿에서 조건문 쓰기 - if 문으로 이미지 없는 경우 처리하기
post_list.html
{% if p.head_image %}
<img class="card-img-top" src="{{ p.head_image.url }}" alt="{{ p.title }}" />
{% else %}
<img class="card-img-top" src="https://picsum.photos/700/300" alt="{{ p.title }}">
{% endif %}
다음과 같이 head_image가 있을 경우와 없을 경우로 나누어서 조건문을 작성해준다. 이미지가 없을 경우에는 lorem picsum에서 불러온다.
이 때 다음과 같은 문제가 있다
picsum에서 불러오는 이미지는 매번 업데이트 된다.
이미지가 없는 모든 포스트의 picsum 이미지가 동일하다
다음과 같이 해결할 수 있다
picsum id 사용 : https://picsum.photos/id/237/200/300
id가 너무 커지면 이미지 출력이 안될 수 있음
따라서, seed 사용 : https://picsum.photos/seed/picsum/200/300
템플릿에서 조건문 쓰기 - 첨부파일이 있는 경우 다운로드 버튼 만들기
업로드된 파일이 있다면 파일을 다운받을 수 있는 버튼을 출력하고 이 때 확장자에 맞게 아이콘을 출력하려고 한다
물론 head에 fontawesome js 코드를 써줘야 한다.
post_detail.html
{% if post.file_upload %}
<a href="{{ post.file_upload.url }}" type="button" class="btn btn-outline-success" role="button" download="">
Download :
{% if post.get_file_name_ext == 'xlsx' %}
<i class="fas fa-file-excel"></i>
{% elif post.get_file_name_ext == 'md' %}
<i class="fas fa-user-md"></i>
{% else %}
<i class="fas fa-file-alt"></i>
{% endif %}
{{ post.get_file_name}}
</a>
{% endif %}
models.py
def get_file_name(self):
return os.path.basename(self.file_upload.name)
def get_file_ext(self):
return self.get_file_name().split('.')[-1]
부록
한글입숨
긴글이 필요할 때, 아무 의미없는 텍스트가 필요할 때가 있다. 그럴 때 Lorem Ipsum을 흔히들 불러오는데 한글판이 있다.
장고 관리자 계정 찾기
나는 장고 관리자 비밀번호를 생성하지 않았었는데, 장고에서 로그인 할 때는 비밀번호를 반드시 입력했어야 했다. blank=True가 아닌듯...
다음과 같이 실행해서 관리자 계정 아이디를 얻고 비밀번호를 변경했다
>>> python manage.py shell
>>> from django.contrib.auth.models import User
>>> superusers = User.objects.filter(is_superuser=True)
>>> superusers
<QuerySet [<User: mini>]>
>>> python manage.py changepassword mini
Changing password for user 'mini'
Password:
Password (again):
Password changed successfully for user 'mini'