django-states2 python

State machine for django models.

Django States

|Build Status|


State engine for django models. Define a state graph for a model and remember the state of each object. State transitions can be logged for objects.


.. code:: sh

pip install django-states

Usage example

To use a state machine, you should add a state field to the model

.. code:: python

from django_states.fields import StateField
from django_states.machine import StateMachine, StateDefinition, StateTransition

class PurchaseStateMachine(StateMachine):
   log_transitions = True

   # possible states
   class initiated(StateDefinition):
       description = _('Purchase initiated')
       initial = True

   class paid(StateDefinition):
       description = _('Purchase paid')

       def handler(self, instance):

   class shipped(StateDefinition):
       description = _('Purchase shipped')

   # state transitions
   class mark_paid(StateTransition):
       from_state = 'initiated'
       to_state = 'paid'
       description = 'Mark this purchase as paid'

   class ship(StateTransition):
       from_state = 'paid'
       to_state = 'shipped'
       description = 'Ship purchase'

       def handler(transition, instance, user):

       def has_permission(transition, instance, user):
           return true_when_user_can_make_this_transition()

class Purchase(StateModel):
    purchase_state = StateField(machine=PurchaseStateMachine, default='initiated')
    ... (other fields for a purchase)

If log_transitions is enabled, another model is created. Everything should be compatible with South_ for migrations.

Note: If you’re creating a DataMigration in South <>__, remember to use

Usage example:

.. code:: python

p = Purchase()

# Will automatically create state object for this purchase, in the # initial state. p.get_purchase_state_info().make_transition(‘mark_paid’, request.user) # User parameter is optional p.state # Will return ‘paid’ p.get_purchase_state_info().description # Will return ‘Purchase paid’

# Returns an iterator of possible transitions for this purchase. p.get_purchase_state_info().possible_transitions()

# Which can be used like this.. [x.get_name() for x in p.possible_transitions]

For better transition control, override:

  • has_permission(self, instance, user): Check whether this user is allowed to make this transition.
  • handler(self, instance, user): Code to run during this transition. When an exception has been raised in here, the transition will not be made.

Get all objects in a certain state::



You can add a test that needs to pass before a state transition can be executed. Well, you can add 2: one based on the current user (has_permission) and one generic (validate).

So on a StateTransition-object you need to specify an extra validate function (signature is validate(cls, instance)). This should yield TransitionValidationError, this way you can return multiple errors on that need to pass before the transition can happen.

The has_permission function (signature has_permission(transition, instance, user)) should check whether the given user is allowed to make the transition. E.g. a super user can moderate all comments while other users can only moderate comments on their blog-posts.


Sometimes you want to group several states together, since for a certain view (or other content) it doesn’t really matter which of the states it is. We support 2 different state groups, inclusive (only these) or exclusive (everything but these):

.. code:: python

class is_paid(StateGroup): states = [‘paid’, ‘shipped’]

class is_paid(StateGroup): exclude_states = [‘initiated’]

State graph

You can get a graph of your states by running the graph_states management command.

.. code:: sh

python graph_states myapp.Purchase.state

This requires graphviz <>__ and python bindings for graphviz: pygraphviz and yapgvb.

.. |Build Status| image:: :target:

Related Repositories



State machine for django models. ...



State machine for django models. ...



State machine for django models. ...



State machine for django models. ...

Top Contributors

gvangool jonathanslenders jgeskens rh0dium dirkmoors Duologic brot nielsvanoch oliviersels sgillis Jogazo jpadilla meizon gcollazo mrbox janfabry linseyray ramn techdragon


-   1.4.3 zip tar
-   1.4.2 zip tar
-   1.4.1 zip tar
-   1.4.0 zip tar
-   1.3.11 zip tar
-   1.3.10 zip tar
-   1.3.9 zip tar
-   1.3.8 zip tar
-   1.3.7 zip tar
-   1.3.6 zip tar
-   1.3.5 zip tar
-   1.3.4 zip tar
-   1.3.3 zip tar
-   1.3.2 zip tar
-   1.3.1 zip tar
-   1.3.0 zip tar
-   1.2.21 zip tar
-   1.2.20 zip tar
-   1.2.19 zip tar
-   1.2.18 zip tar
-   1.2.17 zip tar
-   1.2.16 zip tar
-   1.2.15 zip tar
-   1.2.14 zip tar
-   1.2.13 zip tar
-   1.2.12 zip tar
-   1.2.11 zip tar
-   1.2.10 zip tar
-   1.2.9 zip tar
-   1.2.8 zip tar