

Medium-editor : https://github.com/yabwe/medium-editor

게시글을 쓸때 이러한 기능들이 제공되어야 하기 떄문에 articleapp 의 forms.py 를 수정한다.
기존의 모델 Form 은 일반적인 field 만 정해주고 따로 설정은 해주지 않았다.
이에 추가적으로 커스터마이징 진행
그전에 먼저 MediumEditor 사용법을 보자

간략히 살펴보면 'editable' 이라는 이름을 가진 MediumEditor 객체 editor 를 생성해주기만 하면 나머지 기능적인 면은 자동으로 구현이 된다.
따라서 attribute 안에다가 우리가 원하는 클래스 정보를 넣어줄때 클래스 이름이 'editable'
이러한 여러 attr 를 구성하는 위젯 textArea form 을 포함한 charfield form 으로 content 필드를 만든다.
from django.forms import ModelForm
from django import forms
from articleapp.models import Article
class ArticleCreationForm(ModelForm):
content = forms.CharField(widget=forms.Textarea(attrs={'class': 'editable'}))
class Meta:
model = Article
fields = ['title', 'image', 'project', 'content']
오픈소스에 첨부된 링크를 다음 create.html 에 삽입
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<!--Medium-editor 스크립트 링크 삽입 추가-->
<script src="//cdn.jsdelivr.net/npm/medium-editor@5.23.2/dist/js/medium-editor.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/medium-editor@5.23.2/dist/css/medium-editor.min.css" type="text/css" media="screen" charset="utf-8">
<div style="text-align : center; max-width: 500px; margin: 4rem auto;">
<div class="mb-4"> <!-- margin bottom 해서 4배 -->
<h4>Article Create</h4>
</div>
<form action="{% url 'articleapp:create' %}" method="post" enctype="multipart/form-data"> <!--url 일원화, post 방식 으로 전송 -->
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
<!--Medium-editor 선언하는 부분 추가-->
<script>var editor = new MediumEditor('.editable');</script>
{% endblock %}
결과를 확인해보면 내용 부분에 태그로 감싸져있는 글 형태로만 보임.
그 이유 : content 를 detail 페이지에 그냥 뿌랴줘서 그렇다.
<p> {{ target_article.content }} </p>

articleapp/detail.html 내부 코드
해결
간단한 safe 필터를 추가한다면 태그들은 벗겨지고 나머지 셋팅된 일반적인 태그들만 나올 수 있게 된다.
div 태그로 감싸면서 왼쪽 정렬 스타일


업데이트를 눌러보게 되면 이런식으로 나온다.
1) 따라서, createview 뿐만 아니라 updateview 도 적용시켜줘야한다.

2) 또한 Project 선택하지 않을 경우에도 게시글을 작성할 수 있도록 수정해줘야 한다.
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<!--Medium-editor 커스텀 스크립트 링크 삽입 -->
<script src="//cdn.jsdelivr.net/npm/medium-editor@5.23.2/dist/js/medium-editor.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/medium-editor@5.23.2/dist/css/medium-editor.min.css" type="text/css" media="screen" charset="utf-8">
<div style="text-align : center; max-width: 500px; margin: 4rem auto;">
<div class="mb-4"> <!-- margin bottom 해서 4배 -->
<h4>Article Update</h4>
</div>
<form action="{% url 'articleapp:update' pk=target_article.pk %}" method="post" enctype="multipart/form-data"> <!--url 일원화, post 방식 으로 전송 -->
{% csrf_token %} <!-- csrf_token 은 항상 들어 가야 하는 것 -->
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
<!--Medium-editor 객체 선언 하는 부분 -->
<script>var editor = new MediumEditor('.editable');</script>
{% endblock %}
ModelChoiceField 사용, 인자로는 queryset 사용
from django.forms import ModelForm
from django import forms
from articleapp.models import Article
from projectapp.models import Project
class ArticleCreationForm(ModelForm):
# bootstrap 에 있는 text-left 클래스 사용, 높이 자동 조절
content = forms.CharField(widget=forms.Textarea(attrs={'class': 'editable',
'style': 'height: auto; text-align: left'}))
# 추가
project = forms.ModelChoiceField(queryset=Project.objects.all())
class Meta:
model = Article
fields = ['title', 'image', 'project', 'content']
게시글 업데이트 버튼 클릭시

프로젝트를 선택하지 않아도 게시글 생성 등 가능

