---
description: '210729'
---

# template tags & 조건문

## template tags : truncatechars & truncatewords

기존에 게시글은 모든 컨텐츠를 보여준다. 이 때의 문제점은 게시글이 엄청 길면 그것을 다 보여준다는 것.

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MfgV2jkn8H8Bgpc6BSO%2F-Mfjo8cUeENtz1RsTHKB%2Fimage.png?alt=media\&token=b0bc1cf4-cf87-4ec5-bd14-8103113be449)

이를 일정 조건을 걸어 조금만 보여줄 수 있도록 하는 문법이있다.

```python
<p class="card-text">{{ p.content | truncatewords:50 }}</p>

<p class="card-text">{{ p.content | truncatechars:50 }}</p>
```

* truncatewords는 단어 수, truncatechars는 글자 수 만큼만 보여준다

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MfgV2jkn8H8Bgpc6BSO%2F-Mfjob395TLp4wULYj8O%2Fimage.png?alt=media\&token=45e5a7f4-1563-4170-87b9-1d6f90b543c7)

또, 게시글의 요약 느낌이 나도록 추가할 수 있다.

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MfgV2jkn8H8Bgpc6BSO%2F-MfjpoXxSj7B0gvhxE3_%2Fimage.png?alt=media\&token=ef447490-8f0c-4f7c-bd7b-20b5e0a37f62)

`models.py`

```python
class Post(models.Model):
    hook_text = models.CharField(max_length=100, blank=True)
```

`post_list.html`

```markup
{% if p.hook_text %}
    <h5 class="text-muted"> {{ p.hook_text }} </h5>
{% endif %}
```

* text-muted는 글씨를 조금 흐릿하게 해서 원래 제목과 구별할 수 있도록 한다.

## 템플릿에서 조건문 쓰기  - if 문으로 이미지 없는 경우 처리하기

`post_list.html`

```markup
{% 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`
  * seed는 게시물의 id로 고정

## 템플릿에서 조건문 쓰기 - 첨부파일이 있는 경우 다운로드 버튼 만들기

업로드된 파일이 있다면 파일을 다운받을 수 있는 버튼을 출력하고 이 때 확장자에 맞게 아이콘을 출력하려고 한다

* 물론 head에 fontawesome js 코드를 써줘야 한다.

`post_detail.html`

```markup
{% 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`

```python
    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'
```
