Login

PreSaveMiddleware

Author:
pterk
Posted:
November 20, 2007
Language:
Python
Version:
.96
Tags:
middleware pre_save signals
Score:
1 (after 3 ratings)

With this middleware in place (add it to the MIDDLEWARE_CLASSES in your settings) you can pass a request to the model via a pre_save method on the model.

I'm not sure if it is an improvement over the [threadlocals method] (http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser) but it may be an alternative that can be improved upon?

class MyModel(models.Model):
    name = models.CharField(max_length=50)
    created = models.DateTimeField()
    created_by = models.ForeignKey(User, null=True, blank=True)

    def pre_save(self, request):
        if not self.id:
            self.created_by = request.user
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.dispatch import dispatcher
from django.db.models import signals

PRE_SAVE_REQUEST = None

class PreSaveMiddleware(object):
    """ 
    This bit of middleware just saves the request in a global variable
    that can be used to pass the request on to any pre_save methods in
    your models
    """

    def process_request(self, request):
        global PRE_SAVE_REQUEST
        PRE_SAVE_REQUEST = request

def pre_save(**kwargs):
    instance  = kwargs['instance']
    if getattr(instance, 'pre_save', None):
        instance.pre_save(PRE_SAVE_REQUEST)

dispatcher.connect(pre_save, signal=signals.pre_save)

More like this

  1. "Autoconnect" model decorator, easy pre_save and post_save signal connection by bendavis78 4 years, 10 months ago
  2. Accept Header Middleware by kioopi 7 years, 1 month ago
  3. URL models by diverman 5 years, 7 months ago
  4. Add get_addr() method to request object by nikmolnar 2 years, 5 months ago
  5. Format transition middleware by limodou 8 years, 2 months ago

Comments

Please login first before commenting.