django-reversion is an extension to the Django web framework that provides version control for model instances.

Overview

django-reversion

PyPI latest PyPI Version PyPI License TravisCI Docs

django-reversion is an extension to the Django web framework that provides version control for model instances.

Requirements

  • Python 3.6 or later
  • Django 2.0 or later

Features

  • Roll back to any point in a model instance's history.
  • Recover deleted model instances.
  • Simple admin integration.

Documentation

Check out the latest django-reversion documentation at Getting Started

Issue tracking and source code can be found at the main project website.

You can keep up to date with the latest announcements by joining the django-reversion discussion group.

Upgrading

Please check the Changelog before upgrading your installation of django-reversion.

Contributing

Bug reports, bug fixes, and new features are always welcome. Please raise issues on the django-reversion project site, and submit pull requests for any new code.

  1. Fork the repository on GitHub.
  2. Make a branch off of master and commit your changes to it.
  3. Install requirements.
$ pip install django psycopg2 mysqlclient -e .
  1. Run the tests
$ tests/manage.py test tests
  1. Create a Pull Request with your contribution

Contributors

The django-reversion project was developed by Dave Hall and contributed to by many other people.

Comments
  • Can't use proxy models with django-reversion

    Can't use proxy models with django-reversion

    Hello!

    Currently exception is thrown when one tries to register a proxy model. Advice is to register a parent class.

    But django emits post_save signal with a proxy model class as a sender (not a parent class) so _post_save_receiver is omitted and thus a version/revision is lost.

    Why exactly we may want to restrict proxy-model registration?

    It works for me if I register both parent and proxy-child (assuming that I've commented out raise RegistrationError(..)).

    bug 
    opened by freevoid 47
  • squashed migration broke django-reversion upgrade.

    squashed migration broke django-reversion upgrade.

    Issue: Django version: 1.9.7 django-reversion version: 2.0.5 I was using django-reversion 1.8.0, and there is no "db" columns in reversion_version table. Now I am upgrading to version 2.0.5, it adds the column "db" in migration 3, but since there is also a squashed migration file there, when I run python manage.py migrate --fake-initial, it will fake the squashed migration and ignore all the other migrations in the folder, and the migration 2,3,4 will never be ran, so "db" column will not be added to the existing reversion_version table.

    Suggested solution: Remove squashed migration.

    Thanks.

    worksforme needsmoreinfo 
    opened by xuchen81 30
  • Problem with proxy models and inlines

    Problem with proxy models and inlines

    Use case: model and a sub model, both are proxies, created and edited via admin using inline, Problem: The history view show only changes done to the parent model. in other terms: Recorded changes for proxy models within inlines are not visible on the history view

    During investigation, i noticed in the version table, changes recorded foreignkey content_type to concrete model. (changes in parent proxy are recorded pointing to concrete model, same with the child model) while in django_admin_log -as example- , changes (in parent or child) are recorded pointing to the parent proxy model, which makes it easier to retrieve.

    How can i go about solving the Problem? any hints where to start ?

    bug 
    opened by RamezIssac 29
  • Getting NoReverseMatch with 1.9.3 on django-grappelli and django-suit

    Getting NoReverseMatch with 1.9.3 on django-grappelli and django-suit

    Hi,

    I'm trying 1.9.3 and I get this exception when trying to revert a document:

    NoReverseMatch: Reverse for 'app_list' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'admin/(?P<app_label>hardware|profiles|layers|participation|mailing|net|default|nodes|links|cms|auth|connectors|notifications|metrics)/$']
    

    It seems that the template gets a call like reverse('admin:app_list', args=[], kwargs={}, current_app=None) and this causes the exception.

    I do not understand if there is something I have to change in my app in order to upgrade to 1.9.3 or if it might be a bug in django-reversion.

    What do you think?

    Best regards Federico

    blocked 
    opened by nemesisdesign 26
  • revision with json serialized_data fails upon DateField

    revision with json serialized_data fails upon DateField

    Hi!

    my reversioned model contains a DateField called "date". Django-reversion used to, and still does, work fine with that model if the serialized_data is xml. With json serialized_data it fails: see exception added below, reproduced in manage.py shell.

    I narrowed down the problem to wrong json data: django-reverison produces a revision whith json serialized_data which contains "date": "2011-05-05 00:00:00". So if i change that to "date": "2011-05-05" everything's back to normal.

    /path/to/latest/reversion/models.pyc in get_object_version(self)
        187         if isinstance(data, unicode):
        188             data = data.encode("utf8")
    --> 189         return list(serializers.deserialize(self.format, data))[0]
        190 
        191     object_version = property(get_object_version,
    
    /usr/lib/pymodules/python2.7/django/core/serializers/json.pyc in Deserializer(stream_or_string, **options)
         33     else:
         34         stream = stream_or_string
    ---> 35     for obj in PythonDeserializer(simplejson.load(stream), **options):
         36         yield obj
         37 
    
    /usr/lib/pymodules/python2.7/django/core/serializers/python.pyc in Deserializer(object_list, **options)
        126             # Handle all other fields
        127             else:
    --> 128                 data[field.name] = field.to_python(field_value)
        129 
        130         yield base.DeserializedObject(Model(**data), m2m_data)
    
    /usr/lib/pymodules/python2.7/django/db/models/fields/__init__.pyc in to_python(self, value)
        609 
        610         if not ansi_date_re.search(value):
    --> 611             raise exceptions.ValidationError(self.error_messages['invalid'])
        612         # Now that we have the date string in YYYY-MM-DD format, check to make
    
        613         # sure it's a valid date.
    
    
    ValidationError: [u'Enter a valid date in YYYY-MM-DD format.']
    
    worksforme 
    opened by flreinhard 25
  • Django-reversion tests are failing . Django1.3.1, python2.7

    Django-reversion tests are failing . Django1.3.1, python2.7

    ERROR: testRecoverDeleted (reversion.tests.FollowModelsTest)

    Traceback (most recent call last): File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/tests.py", line 466, in testRecoverDeleted reversion.get_deleted(ReversionTestModel1)[0].revision.revert() File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/models.py", line 90, in revert do_revert([version for version in version_set if version.type != VERSION_DELETE]) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/models.py", line 83, in do_revert version.revert() File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/models.py", line 286, in revert self.object_version.save() File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save models.Model.save_base(self.object, using=using, raw=True) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/db/models/base.py", line 570, in save_base created=(not record_exists), raw=raw, using=using) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send response = receiver(signal=self, sender=sender, **named) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/revisions.py", line 566, in _post_save_receiver version_data = adapter.get_version_data(instance, VERSION_ADD) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/revisions.py", line 106, in get_version_data "serialized_data": self.get_serialized_data(obj), File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/reversion/revisions.py", line 90, in get_serialized_data fields = self.get_fields_to_serialize(), File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/core/serializers/init.py", line 91, in serialize s.serialize(queryset, **options) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/core/serializers/base.py", line 48, in serialize self.handle_fk_field(obj, field) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/core/serializers/python.py", line 48, in handle_fk_field related = getattr(obj, field.name) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/db/models/fields/related.py", line 315, in get rel_obj = QuerySet(self.field.rel.to).using(db).get(**params) File "/Users/djangodeveloper/virtual_environments/ngc/lib/python2.7/site-packages/django/db/models/query.py", line 349, in get % self.model._meta.object_name) DoesNotExist: ReversionTestModel1 matching query does not exist.

    worksforme 
    opened by jakkana 23
  • ProtectedError

    ProtectedError

    Hi,

    I have a model (my_model) with foreignkeys with "on_delete" set to "models.PROTECT". my_link = models.ForeignKey(my_other_model, on_delete=models.PROTECT, null=True, blank=True) If I create a my_model and dont set my_link, then reversion works fine. But if I set my_link to actually link to an instance of my_other_model then I get the following error when I try to look at a reversion history instance in the admin view. E.g going to: http://127.0.0.1:8000/admin/my_app/my_model/1/history/1/ gives: Internal Server Error: /admin/my_app/organism/1/history/1/ Traceback (most recent call last): File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/utils/decorators.py", line 130, in _wrapped_view response = view_func(request, *args, **kwargs) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func response = view_func(request, *args, **kwargs) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/contrib/admin/sites.py", line 231, in inner return view(request, *args, **kwargs) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/reversion/admin.py", line 214, in revision_view return self._reversion_revisionform_view( File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/reversion/admin.py", line 164, in _reversion_revisionform_view version.revision.revert(delete=True) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/reversion/models.py", line 101, in revert collector.collect(list(group)) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/db/models/deletion.py", line 245, in collect field.remote_field.on_delete(self, field, sub_objs, self.using) File "/home/my_user/.pyenv/versions/3.8.0/envs/ve38/lib/python3.8/site-packages/django/db/models/deletion.py", line 23, in PROTECT raise ProtectedError( django.db.models.deletion.ProtectedError: ("Cannot delete some instances of model 'my_other_model' because they are referenced through a protected foreign key: 'my_model.mylink'", <QuerySet [<my_model: my_model_string>]>) "GET /admin/my_app/organism/1/history/1/ HTTP/1.1" 500 121554

    It would appear the offending part is when reversion tries to : "# Delete objects that are no longer in the current revision."

    opened by cfblaeb 22
  • accessing many-to-many queryset of a version...

    accessing many-to-many queryset of a version...

    One questions, how can i access a many-to-many field queryset of a version?

    This doesn't work, because it's not the data from the version, it's the current obj data:

    obj = version.object_version.object
    related = getattr(obj, field.name)
    queryset = related.all()
    

    the same with this:

    concrete_model = obj._meta.concrete_model
    many_to_many_fields = concrete_model._meta.many_to_many
    for field in many_to_many_fields:
        queryset = field.value_from_object(obj)
    

    One way i get the right data is this:

    obj = version.object_version.object
    related = getattr(obj, field.name)
    ids = version.field_dict[field.name]
    queryset = many_related_manager.filter(pk__in=ids)
    

    Is this a best practise solution?

    EDIT: Find out that the last example doesn't work, too: many_related_manager.all() will not return all existing values...

    It's for: https://github.com/jedie/django-reversion-compare/commit/90b9c486aac170596568286bb5d37f73aefa09f1#L0R70

    EDIT2: Some info of the objects in the example: version: instance of reversion.models.Version field: instance of django.db.models.fields.related.ManyToManyField and comes from: obj._meta.concrete_model._meta.many_to_many many_related_manager: instance of django.db.models.fields.related.ManyRelatedManager

    opened by jedie 22
  • Add new version to already created revision

    Add new version to already created revision

    I have created a "backup" functionality using the Django Reversion library for an object that keeps revision of a registered model, including the related objects (foreign keys etc.).

    Let's use the following case as an example.

    class Newspaper:
       title = models.CharField()
    
    class Article:
       newspaper = models.ForeignKey('Newspaper') 
    

    When the user clicks to keep a backup of a newspaper object, a revision of the newspaper is created along with the already created articles, under the same revision. I did it so that when the user chooses to revert back to the latest backup, all related objects under the same revision to be reverted.

    The problem starts when a new article of the newspaper is created after the revision is created. The issue is that if the user chooses to revert to the previous revision (the one before creating the new article), the new article will still be there because it was not registered in the latest revision.

    Furthermore, I don't want to create a new revision every time a new article is created because then there might be other changes included that the user will not want to include to the revision.

    What I think might be a suitable solution, is when a new article is created, to create a Version of the article and register it in the latest created revision of the newspaper, but I don't know if it's possible using the functions provided by the API (maybe using add_to_revision?)

    opened by kplatis 21
  • generic diff view

    generic diff view

    django-reversion needs IMHO a easy way to add a diff view. We only have this few helper methods, but no prepared way to add them to the Admin, see: https://github.com/etianen/django-reversion/wiki/Generating-Diffs

    I started a new branch to add a simple diff view to VersionAdmin(), here: https://github.com/jedie/django-reversion/compare/diff

    I made some screenshots (from 03.05.2012): http://www.pylucid.org/de/about/screenshorts/django-reversion/

    The idea is to only add a generic diff and a developer can simply overwrite the method VersionAdmin.make_diff() to make a more meaningful diff.

    The current make_diff() implementation makes a difflib.ndiff() over a "pretty-print" representation of the model data. IMHO this is the only reasonable thing to do in a generic way, isn't it?

    Maybe we can remove make_diff() from the VersionAdmin class and insert the links to the diff view only, if the inherited Admin class implement a make_diff() method?

    opened by jedie 20
  • Model instances without primary key value are unhashable in admin panel

    Model instances without primary key value are unhashable in admin panel

    I have implemented a "backup" functionality when a user wants to keep a revision of his object along with all the related ones. I have implemented the admin integration and registered all the "follows" correctly. When the user presses the "create new backup" button, then the following code is executed:

        with reversion.create_revision():
            main_object.save()
    
            reversion.set_user(request.user)
            reversion.set_comment(comment)
    

    and a revision is created for the object and all the related ones.

    The problem appears when I create a new object that has a relationship to the main_object. When the new object is created, if the user presses "Create new Backup", then a revision is successfully created for the main_object and all the related ones BUT the previous revisions show this message on the admin panel: "Model instances without primary key value are unhashable".

    The traceback that appears is:

    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
      132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
      110.                     response = view_func(request, *args, **kwargs)
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
      57.         response = view_func(request, *args, **kwargs)
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
      233.             return view(request, *args, **kwargs)
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/reversion/admin.py" in revision_view
      238.             context,
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/reversion/admin.py" in _reversion_revisionform_view
      184.                 version.revision.revert(delete=True)
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/reversion/models.py" in revert
      89.                         if item not in old_revision:
    File "/Users/platico/PycharmProjects/news-service/src/lib/python2.7/site-packages/django/db/models/base.py" in __hash__
      521.             raise TypeError("Model instances without primary key value are unhashable")
    
    

    with an Exception Type of TypeError and an Exception Value of Model instances without primary key value are unhashable

    opened by kplatis 18
  • Using fixtures to initialise versioned inline data

    Using fixtures to initialise versioned inline data

    Hey, apologies if this is a known thing, but I've been unable to find an answer in the docco.

    I'm trying to use fixtures to initialize some standing data for a Django Admin based application. Having loaded the fixtures, I call createinitialrevisions to initialize Reversion. The problem I'm having is that inline objects are being initialized with separate revision_ids to their parents in the reversion_version table (these are simple value objects, rather than being first class entities, and have no lifecycle outside their containing parent). I guess this makes sense as Reversion does not know which objects need to be versioned together. This means that if I amend or delete these parent objects, their dependent inline objects are not tied to the parents correctly, and cannot be reverted or recovered with them.

    If I use the Admin GUI the relationship between the parents and inline objects is known, and Reversion can group the changes together correctly. However, for the initial bulk loading of data this isn't a practical approach.

    Is there some way to tie data loaded through fixtures together so that Reversion knows what is going on when createinitialrevisions is called? If not, is there a recommended way to programmatically initialize related standing data in a Reversion friendly way?

    Thanks for any pointers.

    opened by nybl 3
  • Add step to show version data and allow for confirmation prior to to reversion

    Add step to show version data and allow for confirmation prior to to reversion

    When reversion has been configured for the admin, the history view of an object shows the following: image

    The issue is that clicking on any of the linked versions immediately results in an attempt at reverting to that version. Regardless of any wording placed around the links, the linked pages are retrieved using HTTP GET and result in an "unsafe" operation, resulting in a violation of the HTTP spec:

    If the purpose of such a resource is to perform an unsafe action, then the resource owner MUST disable or disallow that action when it is accessed using a safe request method.

    Note use of the word MUST in the wording above (emphasis mine) - this is an absolute requirement and a strict violation of expected web semantics.

    The fix seems relatively easy. Show an intermediary page (like Django does when deleting an object), asking the user to confirm their action which should then POST a request that performs the reversion returning a HTTP 301 response the Location header set to either the object history or change page.

    opened by tysonclugg 4
  • Introduce default format setting.

    Introduce default format setting.

    Good evening,

    The reason I'm interested in this pull request to be landed:

    We frequently use model field from third-party library which can't be handled by core Django serializers.

    I wrote custom serializer, not big deal. But now I need to mention custom format name in every call to register decorator.

    Would be nice to set it once and forget about it :smile:

    Best regards, Josiah.

    opened by proofit404 6
  • Explain how to create revisions with bulk actions

    Explain how to create revisions with bulk actions

    The documentation notes:

    Bulk actions, such as Queryset.update(), do not send signals, so won’t be noticed by django-reversion.

    It would be helpful to expand that infobox with how people can work around that if desired and generate the versions anyway. In particular, I think looping over the queryset and using add_to_revision should work. Of course it would be good include a performance caveat, especially if #924 isn't fixed first.

    Possible text:

    Bulk actions (such as Queryset.update(), Queryset.bulk_update, or Queryset.bulk_create()) do not send signals, so won’t be noticed by django-reversion. You can use add_to_revision with bulk_update or bulk_create as a workaround, but this may eliminate the performance advantage of doing bulk actions since this requires fetching the objects into memory (unlike update()) and reversion will do one query per new version object (#924).

    opened by dehnert 1
  • Re-add support for `bulk_create`

    Re-add support for `bulk_create`

    Between 1.8.0 and 1.8.6 (#380), reversion used bulk_create when creating versions, which presumably dramatically improved performance when creating a revision with many changed model instances[1]. It sounds like the motivation for removing this was inability to get back object primary keys from bulk_create, but that has since been fixed on some popular databases -- Django 1.10 (released about a year and a half after #380) added some support (only PostgreSQL at the time). SQLite was added in Django 4.0, and MariaDB was added sometime in the middle. It looks like there's a convenient feature test for this (connection.features.can_return_rows_from_bulk_insert), so it would be nice if django-reversion could use bulk_create when feasible.

    (I found #380 while trying to figure out why tons of queries were being used despite the changelog claiming reversion uses bulk_create, so if you don't re-add bulk_create support it might be nice to note the change somewhere?)

    [1] I haven't benchmarked this specifically, but a script that creates several thousand objects went from 30 minute runtime to ~3 minutes by doing far more query batching, so I suspect this is significant.

    opened by dehnert 2
Releases(v5.0.4)
Owner
Dave Hall
Experienced Python, Rust and Typescript developer. Equally comfortable in the cloud, or down to the metal on embedded hardware.
Dave Hall
Probably the best abstract model / admin for your tree based stuff.

django-treenode Probably the best abstract model / admin for your tree based stuff. Features Fast - get ancestors, children, descendants, parent, root

Fabio Caccamo 360 Jan 05, 2023
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI

martor Martor is a Markdown Editor plugin for Django, supported for Bootstrap & Semantic-UI. Features Live Preview Integrated with Ace Editor Supporte

659 Jan 04, 2023
Twitter Bootstrap for Django Form - A simple Django template tag to work with Bootstrap

Twitter Bootstrap for Django Form - A simple Django template tag to work with Bootstrap

tzangms 557 Oct 19, 2022
Hotwired/Turbo Django response helpers

This package provides helpers for server-side rendering of Hotwired/Turbo streams and frames. Disclaimer: the Hotwired/Turbo client libraries are, at

Hotwire for Django 66 Apr 07, 2022
PEP-484 stubs for Django

pep484 stubs for Django This package contains type stubs and a custom mypy plugin to provide more precise static types and type inference for Django f

TypedDjango 1.1k Dec 30, 2022
Full featured redis cache backend for Django.

Redis cache backend for Django This is a Jazzband project. By contributing you agree to abide by the Contributor Code of Conduct and follow the guidel

Jazzband 2.5k Jan 03, 2023
Plug and play continuous integration with django and jenkins

django-jenkins Plug and play continuous integration with Django and Jenkins Installation From PyPI: $ pip install django-jenkins Or by downloading th

Mikhail Podgurskiy 941 Oct 22, 2022
This is a sample Django Form.

Sample FORM Installation guide Clone repository git clone https://github.com/Ritabratadas343/SampleForm.git cd to repository. Create a virtualenv by f

Ritabrata Das 1 Nov 05, 2021
Customize the behavior of django.contrib.auth permissions.

Customizando o comportamento do django.contrib.auth. O que queremos? Não criar as permissões padrões automaticamente (add, delete, view, read). Criar

Henrique Bastos 7 Nov 26, 2022
Django app for handling the server headers required for Cross-Origin Resource Sharing (CORS)

django-cors-headers A Django App that adds Cross-Origin Resource Sharing (CORS) headers to responses. This allows in-browser requests to your Django a

Adam Johnson 4.8k Jan 03, 2023
Integarting Celery with Django to asynchronous tasks 📃

Integrating 🔗 Celery with Django via Redis server ,To-Do asynchronously 👀task without stopping the main-flow 📃 of Django-project . It increase your speed 🚀 and user experience 🤵 of website

Rushi Patel 4 Jul 15, 2022
A Django based shop system

django-SHOP Django-SHOP aims to be a the easy, fun and fast e-commerce counterpart to django-CMS. Here you can find the full documentation for django-

Awesto 2.9k Dec 30, 2022
A calendaring app for Django. It is now stable, Please feel free to use it now. Active development has been taken over by bartekgorny.

Django-schedule A calendaring/scheduling application, featuring: one-time and recurring events calendar exceptions (occurrences changed or cancelled)

Tony Hauber 814 Dec 26, 2022
Djangoblog - A blogging platform built on Django and Python.

djangoblog 👨‍💻 A blogging platform built on Django and Python

Lewis Gentle 1 Jan 10, 2022
Store model history and view/revert changes from admin site.

django-simple-history django-simple-history stores Django model state on every create/update/delete. This app supports the following combinations of D

Jazzband 1.8k Jan 06, 2023
MAC address Model Field & Form Field for Django apps

django-macaddress MAC Address model and form fields for Django We use netaddr to parse and validate the MAC address. The tests aren't complete yet. Pa

49 Sep 04, 2022
Template de desarrollo Django

Template de desarrollo Django Python Django Docker Postgres Nginx CI/CD Descripción del proyecto : Proyecto template de directrices para la estandariz

Diego Esteban 1 Feb 25, 2022
Analytics services for Django projects

django-analytical The django-analytical application integrates analytics services into a Django project. Using an analytics service with a Django proj

Jazzband 1.1k Dec 31, 2022
Visual DSL framework for django

Preface Processes change more often than technic. Domain Rules are situational and may differ from customer to customer. With diverse code and frequen

Dmitry Kuksinsky 165 Jan 08, 2023
A tool to automatically fix Django deprecations.

A tool to help upgrade Django projects to newer version of the framework by automatically fixing deprecations. The problem When maintaining a Django s

Bruno Alla 155 Dec 14, 2022