django-sirtrevor is a simple Django app that provides a content editing widget based on the fantastic Sir Trevor project.
Install django-sirtrevor:
pip install django-sirtrevor
Add
sirtrevor
to your INSTALLED_APPS setting like this:INSTALLED_APPS = ( ... 'sirtrevor', )
Add sir trevor urls:
url(r'^sirtrevor/', include('sirtrevor.urls')),
Create a model that makes use of
SirTrevorField
:from django.db import models from sirtrevor.fields import SirTrevorField class MyModel(models.Model): ... content = SirTrevorField() ...
Now you can …
- see it in action in the Django admin
- create a
ModelForm
from your model - create a plain
Form
and usesirtrevor.forms.SirTrevorFormField
- use
sirtrevor.widgets.SirTrevorWidget
as a widget replacement for aTextarea
Sir Trevor has a few configuration options. You can customize most of
them project-wide in your settings.py
or some on a per-widget basis as
kwargs
for SirTrevorWidget
.
Available options (CONFIGURATION_SETTINGS
/ widget_kwargs
):
SIRTREVOR_BLOCK_TYPES
/st_block_types
- A list of block types to use with the editor.
Defaults to
['Text', 'List', 'Quote', 'Image', 'Video', 'Tweet', 'Heading']
SIRTREVOR_DEFAULT_TYPE
/st_default_type
- The default block to start the editor with.
Defaults to
None
SIRTREVOR_BLOCK_LIMIT
/st_block_limit
- The overall total number of blocks that can be displayed.
Defaults to
0
SIRTREVOR_BLOCK_TYPE_LIMITS
/st_block_type_limits
- Limit on the number of blocks that can be displayed by its type.
Defaults to
{}
SIRTREVOR_REQUIRED
/st_required
- Mandatory block types that are required for validatation.
Defaults to
None
SIRTREVOR_UPLOAD_URL
/st_upload_url
- URL for AJAX image uploads.
Defaults to
/sirtrevor/attachments/
(depending on where you include django-sirtrevor's URLs inurls.py
) SIRTREVOR_UPLOAD_PATH
- Path where to store uploaded images relative to
MEDIA_ROOT
. (not configurable via widget kwargs) Defaults toattachments
SIRTREVOR_ATTACHMENT_PROCESSOR
- A string containing a dotted path to a function that will be run before
saving an uploaded image. See below for more details. (not configurable via
widget kwargs)
Defaults to
None
You can resize uploaded images by implementing a function somewhere in your
code and pointing SIRTREVOR_ATTACHMENT_PROCESSOR
to its location. The first
argument will be the file object and the method must return a
SimpleUploadFile
object.
Example implemented in utils.py
in an app called core
.
SIRTREVOR_ATTACHMENT_PROCESSOR
set to core.utils.resize_attachment
:
from PIL import Image from StringIO import StringIO from django.core.files.uploadedfile import SimpleUploadedFile def resize_attachment(file_): size = (1024, 9999) try: temp = StringIO() image = Image.open(file_) image.thumbnail(size, Image.ANTIALIAS) image.save(temp, 'jpeg') temp.seek(0) return SimpleUploadedFile(file_.name, temp.read(), content_type='image/jpeg') except Exception as ex: return file_
Sir Trevor can be extended through custom blocks. Starting with 0.2.1 django-sirtrevor also has basic support for custom blocks.
Here is a little step-by-step guide:
myapp/blocks.py:
from sirtrevor.blocks import BaseBlock class MyCustomBlock(BaseBlock): name = 'MyCustomName' class Media: js = ['sirtrevor/blocks/mycustomblock.js']
myapp/models.py:
import sirtrevor from .blocks import MyCustomBlock sirtrevor.register_block(MyCustomBlock)
myapp/static/sirtrevor/blocks/mycustomblock.js:
SirTrevor.Blocks.MyCustomName = SirTrevor.Block.extend({ type: 'mycustomblock', // ... });
Please refer to Sir Trevor's docs regarding custom blocks for details about the JavaScript part of a custom block.
myapp/templates/sirtrevor/blocks/mycustomblock.html:
<div class="content-block mycustom-block"> <!-- Whatever JSON the custom block creates is available in the template --> </div>
settings.py:
# ... SIRTREVOR_BLOCK_TYPES = ['Text', '...', 'MyCustomName'] # ...
For reference please check out django-sirtrevor-file which implements a simple block type for file downloads.