#python #django #ace-editor
#python #django #ace-редактор
Вопрос:
Я играю с идеей редактирования моих шаблонов Django с сервера. Я знаю, что это далеко от этого, но я написал этот фрагмент кода:
def editor(request):
handle=open(os.path.join(settings.BASE_DIR, 'app/code/test.html'), 'r ')
var=handle.read()
context = {
"message": "editor",
"code": var
}
return render(request, 'app/editor.html', context)
Который считывает файл и передает его содержимое в шаблон, где ace.js отображает его в редакторе.
<div id="editor-container">
<div id="editor">{{code}}</div>
</div>
Он отображается просто отлично, и я могу редактировать текст, но если бы я хотел сохранить свои изменения, записав их в файл, кнопка должна была бы перейти к маршруту сохранения, потому что я не использую ajax, но как мне передать новую версию документа в представление для записик файлу?
Ответ №1:
Для выполнения этой работы вам необходимо иметь скрытый ввод. Всякий раз, когда содержимое редактора обновляется, входные данные также обновляются. Сохранение содержимого — это просто вопрос отправки формы. Вот что я придумал.
Сначала это html-шаблон, в котором находится редактор.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ace editing</title>
<style type="text/css" media="screen">
#editor {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.editor-container {
position: relative;
height: 300px;
width: 100%;
}
</style>
</head>
<body>
<div class="editor-container">
<div id="editor">
{{code}}
</div>
</div>
<form method="POST">
{% csrf_token %} {{form.as_p}}
<button type="submit">Save</button>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js"></script>
<script>
var editor = ace.edit('editor');
editor.setTheme("ace/theme/monokai");
editor.session.setMode("ace/mode/html");
editor.on('change', function() {
code_hidden_input = document.querySelector('#id_code');
code_hidden_input.value = editor.getValue();
console.log(editor.getValue())
})
</script>
</body>
</html>
Теперь в вашем views.py код будет выглядеть следующим образом.
from django.shortcuts import render
from .forms import MyForm
import os
from django.conf import settings
# Create your views here.
def index(request):
form = MyForm()
handle = open(os.path.join(settings.BASE_DIR, 'core/templates/core/test.html'))
code = handle.read()
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
print(form.cleaned_data['code'])
# This is the part where you save the code you have
# edited to some file
context = {
'form': MyForm(),
'code': code
}
return render(request, "core/index.html", context)
В вашем forms.py файл создайте класс с именем My Form
, как показано ниже
from django import forms
class MyForm(forms.Form):
code = forms.CharField(max_length=10000, widget=forms.HiddenInput())
Вот и все, обратите внимание, что при отправке html с использованием форм вам необходимо очистить свой ввод.
Комментарии:
1. Спасибо, это хорошее решение. Я нашел github.com/django-ace/django-ace и он делает то же самое, но он загружает ace в текстовый ввод и все ace.js параметры встроены в форму django.