Thanks a lot, I missed to override the TabularInline class, too. I
will give it a try.

On 1 Feb., 18:01, Daniel Roseman <dan...@roseman.org.uk> wrote:
> On Feb 1, 4:11 pm, Henning Kage <henning.k...@googlemail.com> wrote:
>
>
>
>
>
> > Hello together,
>
> > I have overriden the models.Model.save method and added a parameter
> > called 'user', so that each save-call of an object will store the
> > creation date/author and update date/user:
>
> > class Model(models.Model):
>
> >     class Meta:
> >         abstract = True
>
> >     def save(self, user, force_insert=False, force_update=False):
> >         now = datetime.datetime.now()
> >         if not self.id:
> >             self.created = now
> >             self.created_by = user
> >         self.updated = now
> >         self.updated_by = user
> >         super(Model, self).save(user)
>
> > In our projects, we always have these four timestamp fields, and I
> > want them to be filled out automatically. That works fine so far, but
> > when I use a TabularInline view for an object's ModelAdmin, a save
> > causes the following traceback:
>
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/core/handlers/base.py" in get_response
> >   92.                 response = callback(request, *callback_args,
> > **callback_kwargs)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/contrib/admin/options.py" in wrapper
> >   226.                 return self.admin_site.admin_view(view)(*args,
> > **kwargs)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/views/decorators/cache.py" in
> > _wrapped_view_func
> >   44.         response = view_func(request, *args, **kwargs)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/contrib/admin/sites.py" in inner
> >   186.             return view(request, *args, **kwargs)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/db/transaction.py" in _commit_on_success
> >   240.                 res = func(*args, **kw)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/contrib/admin/options.py" in add_view
> >   737.                     self.save_formset(request, form, formset,
> > change=False)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/contrib/admin/options.py" in
> > save_formset
> >   563.         formset.save()
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/forms/models.py" in save
> >   522.         return self.save_existing_objects(commit) +
> > self.save_new_objects(commit)
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/forms/models.py" in save_new_objects
> >   657.             self.new_objects.append(self.save_new(form,
> > commit=commit))
> > File "/storage/virtualenvs/teagarden/lib/python2.6/site-packages/
> > Django-1.1.1-py2.6.egg/django/forms/models.py" in save_new
> >   760.             obj.save()
>
> > Exception Type: TypeError at /admin/teagarden/group/add/
> > Exception Value: save() takes at least 2 arguments (1 given)
>
> > Well that's quite clear: the TabularInline model calls a save_formset
> > method which itself triggers save_new, which I cannot override or at
> > last, will not be overriden by my models.Model abstract class. I guess
> > I should'nt alter the methods header by adding parameters, so is there
> > another way to automatically save such timestap fields? I searched a
> > long time for other solutions, but most of them use similar mechanisms
> > as far as I can see it.
>
> > Thanks in advance,
> > Henning
>
> There's two steps to fixing this. First, your save() method should use
> the *args, **kwargs method to accept extra arguments:
>
>    def save(self, *args, **kwargs):
>        user = kwargs.pop('user', None)
>        if user:
>              self.updated_by = user
>        ...etc...
>
> Secondly, in your InlineModelAdmin subclass, you need to define a
> custom save_form method.
>
>     def save_form(self, request, form, change):
>          obj = form.save(commit=False)
>          obj.updated_by = request.user
>          return obj
>
> --
> DR.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to