mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixes #8358, #8396, #8724, #9043, #9128, #9247, #9267, #9267, #9375, #9409, #9414, #9416, #9446, #9454, #9464, #9503, #9518, #9533, #9657, #9658, #9683, #9733, #9771, #9835, #9836, #9837, #9897, #9906, #9912, #9945, #9986, #9992, #10055, #10084, #10091, #10145, #10245, #10257, #10309, #10358, #10359, #10424, #10426, #10508, #10531, #10551, #10635, #10637, #10656, #10658, #10690, #10699, #19528. Thanks to all the respective authors of those tickets. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10371 bcc190cf-cafb-0310-a4f2-bffc1f526a37
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| .. _ref-contrib-flatpages:
 | |
| 
 | |
| =================
 | |
| The flatpages app
 | |
| =================
 | |
| 
 | |
| .. module:: django.contrib.flatpages
 | |
|    :synopsis: A framework for managing simple ?flat? HTML content in a database.
 | |
| 
 | |
| Django comes with an optional "flatpages" application. It lets you store simple
 | |
| "flat" HTML content in a database and handles the management for you via
 | |
| Django's admin interface and a Python API.
 | |
| 
 | |
| A flatpage is a simple object with a URL, title and content. Use it for
 | |
| one-off, special-case pages, such as "About" or "Privacy Policy" pages, that
 | |
| you want to store in a database but for which you don't want to develop a
 | |
| custom Django application.
 | |
| 
 | |
| A flatpage can use a custom template or a default, systemwide flatpage
 | |
| template. It can be associated with one, or multiple, sites.
 | |
| 
 | |
| .. versionadded:: 1.0
 | |
| 
 | |
| The content field may optionally be left blank if you prefer to put your 
 | |
| content in a custom template.
 | |
| 
 | |
| Here are some examples of flatpages on Django-powered sites:
 | |
| 
 | |
|     * http://www.chicagocrime.org/about/
 | |
|     * http://www.everyblock.com/about/
 | |
|     * http://www.lawrence.com/about/contact/
 | |
| 
 | |
| Installation
 | |
| ============
 | |
| 
 | |
| To install the flatpages app, follow these steps:
 | |
| 
 | |
|     1. Install the :mod:`sites framework <django.contrib.sites>` by adding
 | |
|        ``'django.contrib.sites'`` to your :setting:`INSTALLED_APPS` setting,
 | |
|        if it's not already in there.
 | |
|        
 | |
|        Also make sure you've correctly set :setting:`SITE_ID` to the ID of the
 | |
|        site the settings file represents. This will usually be ``1`` (i.e.
 | |
|        ``SITE_ID = 1``, but if you're not using the sites framework to manage
 | |
|        multiple sites, it could be the ID of a different site.
 | |
|        
 | |
|     2. Add ``'django.contrib.flatpages'`` to your :setting:`INSTALLED_APPS`
 | |
|        setting.
 | |
|        
 | |
|     3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
 | |
|        to your :setting:`MIDDLEWARE_CLASSES` setting.
 | |
|        
 | |
|     4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
 | |
|  
 | |
| How it works
 | |
| ============
 | |
| 
 | |
| ``manage.py syncdb`` creates two tables in your database: ``django_flatpage``
 | |
| and ``django_flatpage_sites``. ``django_flatpage`` is a simple lookup table
 | |
| that simply maps a URL to a title and bunch of text content.
 | |
| ``django_flatpage_sites`` associates a flatpage with a site.
 | |
| 
 | |
| The :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware`
 | |
| does all of the work. Each time any Django application raises a 404 error, this
 | |
| middleware checks the flatpages database for the requested URL as a last resort.
 | |
| Specifically, it checks for a flatpage with the given URL with a site ID that
 | |
| corresponds to the :setting:`SITE_ID` setting.
 | |
| 
 | |
| If it finds a match, it follows this algorithm:
 | |
| 
 | |
|     * If the flatpage has a custom template, it loads that template. Otherwise,
 | |
|       it loads the template :file:`flatpages/default.html`.
 | |
|     
 | |
|     * It passes that template a single context variable, :data:`flatpage`, which
 | |
|       is the flatpage object. It uses
 | |
|       :class:`~django.template.context.RequestContext` in rendering the
 | |
|       template.
 | |
| 
 | |
| If it doesn't find a match, the request continues to be processed as usual.
 | |
| 
 | |
| The middleware only gets activated for 404s -- not for 500s or responses of any
 | |
| other status code.
 | |
| 
 | |
| Note that the order of :setting:`MIDDLEWARE_CLASSES` matters. Generally, you can
 | |
| put :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` at
 | |
| the end of the list, because it's a last resort.
 | |
| 
 | |
| For more on middleware, read the :ref:`middleware docs
 | |
| <topics-http-middleware>`.
 | |
| 
 | |
| .. admonition:: Ensure that your 404 template works
 | |
|     
 | |
|     Note that the
 | |
|     :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware`
 | |
|     only steps in once another view has successfully produced a 404 response.
 | |
|     If another view or middleware class attempts to produce a 404 but ends up
 | |
|     raising an exception instead (such as a ``TemplateDoesNotExist``
 | |
|     exception if your site does not have an appropriate template to
 | |
|     use for HTTP 404 responses), the response will become an HTTP 500
 | |
|     ("Internal Server Error") and the
 | |
|     :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware`
 | |
|     will not attempt to serve a flat page.
 | |
| 
 | |
| How to add, change and delete flatpages
 | |
| =======================================
 | |
| 
 | |
| Via the admin interface
 | |
| -----------------------
 | |
| 
 | |
| If you've activated the automatic Django admin interface, you should see a
 | |
| "Flatpages" section on the admin index page. Edit flatpages as you edit any
 | |
| other object in the system.
 | |
| 
 | |
| Via the Python API
 | |
| ------------------
 | |
| 
 | |
| .. class:: models.FlatPage
 | |
| 
 | |
|     Flatpages are represented by a standard
 | |
|     :ref:`Django model <topics-db-models>`,
 | |
|     which lives in `django/contrib/flatpages/models.py`_. You can access
 | |
|     flatpage objects via the :ref:`Django database API <topics-db-queries>`.
 | |
| 
 | |
| .. _django/contrib/flatpages/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models.py
 | |
| 
 | |
| Flatpage templates
 | |
| ==================
 | |
| 
 | |
| By default, flatpages are rendered via the template
 | |
| :file:`flatpages/default.html`, but you can override that for a particular
 | |
| flatpage.
 | |
| 
 | |
| Creating the :file:`flatpages/default.html` template is your responsibility;
 | |
| in your template directory, just create a :file:`flatpages` directory
 | |
| containing a file :file:`default.html`.
 | |
| 
 | |
| Flatpage templates are passed a single context variable, :data:`flatpage`,
 | |
| which is the flatpage object.
 | |
| 
 | |
| Here's a sample :file:`flatpages/default.html` template:
 | |
| 
 | |
| .. code-block:: html+django
 | |
| 
 | |
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
 | |
|         "http://www.w3.org/TR/REC-html40/loose.dtd">
 | |
|     <html>
 | |
|     <head>
 | |
|     <title>{{ flatpage.title }}</title>
 | |
|     </head>
 | |
|     <body>
 | |
|     {{ flatpage.content }}
 | |
|     </body>
 | |
|     </html>
 | |
| 
 | |
| Since you're already entering raw HTML into the admin page for a flatpage,
 | |
| both ``flatpage.title`` and ``flatpage.content`` are marked as **not**
 | |
| requiring :ref:`automatic HTML escaping <automatic-html-escaping>` in the
 | |
| template.
 |