Package: django-prose
Django ProseDjango Prose provides your Django applications with wonderful rich-text editing capabilities.RequirementsPython 3.8 or laterDjango 3.2 or laterBleach 4.0 or laterGetting startedTo get started with Django Prose, all you need to do is followjust four steps.Installdjango-proseWe use and suggest using Poetry, although Pipenv and plain pip will work seamlessly as wellpoetry add django-proseAdd toINSTALLED_APPSAddprosein your Django project's installed apps (example:example/example/settings.py):INSTALLED_APPS=[# Django stock apps (e.g. 'django.contrib.admin')'prose',# your application's apps]Run migrationsThis is required so you can use Django Prose's built-in Document model:python manage.py migrate proseInclude URLsYou need to edit the mainurls.pyfile of your Django project and includeprose.urls:urlpatterns=[path('admin/',admin.site.urls),# other urls ...path("prose/",include("prose.urls")),]Now, you are ready to go 🚀.UsageThere are different ways to use Django prose according to your needs. We will examine all of them here.Rendering rich-text in templatesRich text content essentially is HTML. For this reason it needs to be manually marked assafe, when rendered in Django templates. Example:{{document.content|safe}}Small rich-text contentYou might want to add rich-text content in a model that is just a few characters (e.g. 140), like an excerpt from an article. In that case we suggest using theRichTextField. Example:fromdjango.dbimportmodelsfromprose.fieldsimportRichTextFieldclassArticle(models.Model):excerpt=RichTextField()As mentioned above, you need to mark the article excerpt assafe, in order to render it:<div class="article-excerpt">{{article.excerpt|safe}}</div>Large rich-text contentIn case you want to store large rich-text content, like the body of an article, which can span to quite a few thousand characters, we suggest you use theAbstractDocumentmodel. This will save large rich-text content in a separate database table, which is better for performance. Example:fromdjango.dbimportmodelsfromprose.fieldsimportRichTextFieldfromprose.modelsimportAbstractDocumentclassArticleContent(AbstractDocument):passclassArticle(models.Model):excerpt=RichTextField()body=models.OneToOneField(ArticleContent,on_delete=models.CASCADE)Similarly here as well, you need to mark the article's body assafe, in order to render it:<div class="article-body">{{article.body.content|safe}}</div>Forms with rich-text editingYou can create forms for your Django Prose models, to provide rich-text editing functionality. In that case, you will also need to renderform.media, to load Trix with its stylesheets.<form  method="POST" >{%csrf_token%}{{form.as_p}}{{form.media}}<button type="submit">Submit</button></form>The same is true also, if you are rendering the forms field manually.AttachmentsDjango Prose can also handle uploading attachments with drag and drop. To set this up, first you need to:Set up theMEDIA_ROOTandMEDIA_URLof your Django project (example inexample/example/settings.py))Include the Django Prose URLs (example inexample/example/urls.py)(Optional) Set up a different Django storage to store your files (e.g. S3)Attachments are uploaded with a path structure of/YEAR/MONTH/DATE/UUID.EXTBy default, only files 5MB or less are allowed.Allowed file size can be overridden by settingPROSE_ATTACHMENT_ALLOWED_FILE_SIZEin your Django project's settings file.# File size in megabytesPROSE_ATTACHMENT_ALLOWED_FILE_SIZE=15Full exampleYou can find a full example of a blog, built with Django Prose in theexampledirectory.🔒 A note on securityAs you can see in the examples above, what Django Prose does is provide you with a user friendly editor (Trix) for your rich text content and then store it as HTML in your database. Since you will mark this HTML as safe in order to use it in your templates, it needs to besanitised, before it gets stored in the database.For this reason Django Prose is usingBleachto only allow the following tags and attributes:Allowed tags:p,ul,ol,li,strong,em,div,span,a,blockquote,pre,figure,figcaption,br,code,h1,h2,h3,h4,h5,h6,picture,source,imgAllowed attributes:alt,class,id,src,srcset,href,mediaScreenshotsDjango Prose Documents in Django AdminVideo tutorialIf you are more of a video person, you can watch our video showcasing how toCreate a blog using Django Proseon YouTubeReal world use casesRemote Work Café: Used to edit location pagess, likeAmsterdam | Remote Work CaféIn production by multiple clients ofLOGIC, from small companies to the public sector.If you are using Django Prose in your application too, feek free to open aPull Requestto include it here. We would love to have it.Development for Django ProseIf you plan to contribute code to Django Prose, this section is for you. All development tooling for Django Prose has been set up with Docker and Development Containers.To get started run these commands in the provided order:docker compose run --rm migratedocker compose run --rm createsuperuserdocker compose upIf you are using Visual Studio code, just open this repository in a container using theDev Containers: Open Folder in Container.🦄 Built withLOGIC. 🦄