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
sirtrevorto 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
ModelFormfrom your model - create a plain
Formand usesirtrevor.forms.SirTrevorFormField - use
sirtrevor.widgets.SirTrevorWidgetas 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.