Форматирование сообщения в блоге во Flask / WTForms / Google App Engine - PullRequest
7 голосов
/ 29 марта 2012

Вот краткий вопрос:

Мои записи в блоге на ...

http://www.seanbradley.biz/blog

... полностью отсутствует форматирование.Они просто большой блок открытого текста.Любой код или теги HTML, такие как / n или
... не говоря уже о h1, h2 и т. Д., Не оказывают заметного влияния на способ отображения текста на странице.

Я работаюКолба с WTForms, развернутой на GAE.Как я могу это исправить?Есть ли способ внедрить редактор WYSGIWYG - например, TinyMCE - в поле формы для новых записей в блоге?

Я собираюсь выглядеть так же просто и элегантно, как ...

http://www.quietwrite.com

или

http://lucumr.pocoo.org/

... или как минимум что-то похожее на собственный редактор Stackoverflow.

Форматирование отображаетсяв сообщениях во всех вышеперечисленных публикациях (а не через раздутую панель инструментов редактора).

Я не уверен, связано ли то, что запрещает показ HTML-тегов в моих сообщениях, с настройкой класса в WTForms, или что-то, что должно быть обработано специально в хранилище данных GAE, или что-то, что мне нужно исправить в Flask(например, модель для постов).Любое четкое решение о том, как я - как относительно младший разработчик - могу включить форматирование в эти сообщения в блоге, приносит награду.Конкретный код из приложения ниже ...

Примечание: есть также расширение Flask-Markdown, но я также не уверен, как его интегрировать для достижения желаемого эффекта.

Вопрос в деталях, плюс фрагменты из базы кода

Я использую Flask (с шаблонами Jinja / маршрутизацией Werkzeug, конечно) в Google App Engine и не понимаю, как интегрироватьWYSIWYG-редактор страницы, которую я выделил для постов в блоге ...

Я предполагаю, что при включении TinyMCE вызов JavaScript включается в заголовок шаблона ... примерно так:

<script type="text/javascript" src="/static/js/tiny_mce/tiny_mce.js">


Но затем - потому что, по сути, в шаблоне или самой отрисованной странице нет, это не просто - в соответствии с установочной документацией TinyMCE - вопрос также добавленияследующий блок кода в шаблон ...
<textarea cols="80" rows="10" id="articleContent" name="articleContent">
  &lt;h1&gt;Article Title&lt;/h1&gt;
  &lt;p&gt;Here's some sample text&lt;/p&gt;
</textarea>

<script type="text/javascript">
tinyMCE.init({
  theme : "advanced",
  theme_advanced_toolbar_location : "top",
  theme_advanced_toolbar_align : "left",
  mode : "exact",
  elements : "articleContent"
});
</script>


В настоящее время в тегах файла шаблона ...
<label for="title">{{ form.title.label }}</label>

{{ form.title|safe }}

{% if form.title.errors %}
    <ul class="errors">
        {% for error in form.title.errors %}
        <li>{{ error }}</li>
        {% endfor %}
    </ul>
{% endif %}

<label for="prose">{{ form.prose.label }}</label>

{{ form.prose|safe }}

...more WTForm validation / error handling...


Я подозреваю, что проблема в том, как форма создается / управляется через WTForms.WTForms находится в моей папке / packages / flaskext.Требуется ли что-то вроде следующего ...?
class wtforms.fields.TextAreaField(default field arguments, choices=[], coerce=????????, option_widget=????????)

Но TextAreaField импортируется из (я не знаю, где) ... и не знаю, является ли это даже подходящим местом для настройки.Это ответ в init .py, file.py и / или html5.py модуля WTForm? Опять же, я был бы рад, если бы после публикации отображались только теги HTML, которые я включаю в сообщение ... но приятный способ упростить для тех, кто не привык к HTML, аналогично форматировать свои сообщения, был бы оценен вдвойне,Любая помощь, указывающая мне правильное направление, очень ценится!

Добавьте код, если необходимо, следуйте ...


У меня есть следующий класс в моем models.py ...
class PostModel(db.Model):
    """New Post Model"""
    title = db.StringProperty(required = True)
    prose = db.TextProperty(required = True)
    when = db.DateTimeProperty(auto_now_add = True)
    author = db.UserProperty(required = True)


И следующий класс в моем forms.py ...
class PostForm(wtf.Form):
    title = wtf.TextField('Title: something buzz-worthy...', validators=[validators.Required()])
    prose = wtf.TextAreaField('Content: something beautiful...', validators=[validators.Required()])

1 Ответ

4 голосов
/ 05 апреля 2012

Вопрос о том, что ваш HTML-код должен быть закодирован в HTML, скорее всего, это проблема, возникающая во время рендеринга , а не во время записи. Когда вы получаете данные обратно и сохраняете их в хранилище данных, если ваш HTML все еще является HTML, а не &lt;tag&gt;, вам нужно пометить рендеринг как безопасный:

{% for post in posts %}
<h2>{{ post.title | safe }}<h2>
<article>{{ post.content | safe }}</article>
{% endfor %}

Кроме того, в WTForms Field.Label (как в form.prose.label) фактически отображает полную метку (нет необходимости заключать вызов в нее в предварительно обработанные метки.)

...