django 프로젝트 안에 앱을 만들고 클래스를 선언한뒤 content라는 TextFiel

 
Dokyoung Kim

django 프로젝트 안에 앱을 만들고 클래스를 선언한뒤 content라는 TextField 변수를 다음과 같이 선언하였습니다.
content = models.TextField(blank=True, null=True)
게시판의 글 내용을 저장하는 변수입니다.

템플릿 파일에서
{{ post.content|safe|linebreaks }}
와 같이 불러왔습니다.

safe 필터는 HTML을 글 내에서 사용하기 위해 사용하였고, linebreaks 필터는 줄바꿈 때문에 사용하였습니다.

그런데 띄어쓰기를 아무리 많이 해도 딱 한번만 인식되는 문제가 발생합니다. 무엇이 문제인가요? 제가 뭔가 초보적인걸 모르는것 같지만, 답변해 주시면 감사하겠습니다^^;

  • 남홍김

    http://stackoverflow.com/questions/721035/django-templates-stripping-spaces HTML 스펙 때문인거 같네요. 원하는 것을 구현한 방법도 있으니 한번 보셔요

    Chinseok Lee

    django linebreaks 의 구현에서는 \n 2개 이상을 하나의 구분문자열로해서 split 하기 때문입니다. 그럴경우 linebreaksbr 을 쓰시거나, 직접 구현하셔도 되겠네요. 아래 코드를 참고해보세요.

    linebreaks 의 구현 : \n 2개 이상을 단위로 split
    https://github.com/django/django/blob/1.9.8/django/utils/html.py#L126

    linebreaksbr 의 구현 : \n 1개 단위로 split
    https://github.com/django/django/blob/1.9.8/django/template/defaultfilters.py#L483

    남홍김

    이진석 줄바꿈이 아니라 띄어쓰기에 대해서 물으신거 아닌가요? 질문하신 분이 구분해서 표현하신거 같은데요. 음.

    Dokyoung Kim

    김남홍 (남홍김) 감사합니다. 다음과 같은 거의 비슷하지만 링크해 주신 페이지를 참고해서 저는 다음과 같이 해결했습니다. 앱 폴더 하위에 templatetags라는 폴더를 만들고 __init__.py를 추가한 다음 tags.py에 다음 코드를 입력했습니다.

    from django.template import Library
    from django.template.defaultfilters import stringfilter
    from django.utils.safestring import mark_safe, SafeData
    from django.utils.text import normalize_newlines
    from django.utils.html import escape

    register = Library()

    @stringfilter
    def keep_spacing(value, autoescape=None):
    autoescape = autoescape and not isinstance(value, SafeData)
    value = normalize_newlines(value)
    if autoescape:
    value = escape(value)
    value = mark_safe(value.replace(‘ ‘, ‘    ‘))
    value = mark_safe(value.replace(‘\t’, ‘        ‘))
    return mark_safe(value.replace(‘\n’, ‘
    ‘))
    register.filter(keep_spacing)

    답변 주신 다른 분들도 감사드립니다.

    Dokyoung Kim

    음 근데 여기도 스페이스가 안 먹는군요 ㅋㅋ

    남홍김

    여기라는건 페이스북 말인가요? ㅎㅎ

Advertisements