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
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 3 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Please login first before commenting.