OK well I've refactored my complete approach to be in line with Django best practices and moved validation to validate_unique definitions. I started to rethink the Announcement too by implementing:
def clean_fields(self, exclude=['author',]): """ Implement wrapper for clean_fields to exclude author so we can fill in on save. """ super(Announcement, self).clean_fields(exclude) # EndDef The problem is that it doesn't seem to exclude this field and I still get the error: "This field is required." On Feb 17, 1:55 pm, Matteius <matte...@gmail.com> wrote: > Well I have it configured now so that the fields are editable but that > when None a default value gets set, either the author=request.user > (admin.py layer) and pub_date=datetime.now() when no value is > specified. I had to set (null=True, blank=True) for author in order > to get past form field validation. Then I had to also remove my own > validation from the clean method (and move it to save) for: > > if not self.author: > raise ValidationError('New Announcements require an Author > be specified!') > > Because it is also a requirement that every Announcement have an > author. When I left this same code in the clean method, my saves > would always fail until I specified an author in (advanced options) > but now it can pass clean and still be validated against. I still > have an issue considering how to let people use the admin in a real > world situation. Is it even really desirable to have the option to > edit who the Announcement is published_by? Well in one sense yes > because we work as teams, But entirely no also. for security. You > could add a last_modified field to set editable=False to always keep > an eye on who last changed it, but even still a complete list would be > better. Better yet would be a system where folk didn't pull pranks > like that. Well I guess admin has history and I should perhaps > eventually create history in my own custom form processing if that > kind of monitoring is so important. > > Thanks again, > > Matt > > On Feb 17, 1:36 am, Chris Matthews <ch...@bbd.co.za> wrote: > > > > > Hi Matteius, > > > You must set blank=True in the model so that the form can be returned to > > you with those fields empty and then you fill it in the save(). > > > pub_date = models.DateTimeField(blank=True) > > author = models.ForeignKey(User, blank=True, verbose_name='Author') > > > Also read up on editable=False > > > Regards > > Chris > > > -----Original Message----- > > From: django-users@googlegroups.com [mailto:django-users@googlegroups.com] > > On Behalf Of Matteius > > Sent: 17 February 2011 08:47 > > To: Django users > > Subject: How to Auto fill fields on Save in Django Admin? > > > I have an Announcement model that has two fields I want to auto-fill > > in when they are left blank (they are required fields with normal > > defaults). I have the following Code (simplified data listing for > > this post) ---- THe Problem is that when I go to save an Announement > > in the admin with either of those fields blank it returns to the Add/ > > Edit Form with "This field is required." despite my code to try and > > fill that in. Clearly I'm missing how to do this, any advice? > > > class Announcement(models.Model): > > """ Represents an Announcement in the classcomm system. """ > > > # Data Model Fields > > pub_date = models.DateTimeField() > > author = models.ForeignKey(User, verbose_name='Author') > > > def clean(self): > > """ Implement auto fill pub_date. """ > > if not self.pub_date: > > self.pub_date = datetime.today() > > super(Announcement, self).clean() > > # EndDef > > > def save(self): > > """ Implement auto fill pub_date. """ > > if not self.pub_date: > > self.pub_date = datetime.today() > > super(Announcement, self).save() > > # EndDef > > # EndClass > > > Then in admin.py I have: > > > class AnnouncementAdmin(admin.ModelAdmin): > > """ Admin customizations for Announcement Models. """ > > fieldsets = ( > > (None, { > > 'fields': ('headline', 'department', 'course', 'content') > > }), > > ('Advanced options', { > > 'classes': ('collapse',), > > 'fields': ('author', 'pub_date', 'make_global') > > }), > > ) > > > def save_model(self, request, obj, form, change): > > """ Autofill in author when blank on save models. """ > > obj.author = request.user > > obj.save() > > # EndDef > > > def save_formset(self, request, form, formset, change): > > """ Autofill in author when blank on save formsets. """ > > instances = formset.save(commit=False) > > for instance in instances: > > instance.author = request.user > > instance.save() > > formset.save_m2m() > > # EndDef > > # EndClass > > > Regards, > > Matt > > > -- > > You received this message because you are subscribed to the Google Groups > > "Django users" group. > > To post to this group, send email to django-users@googlegroups.com. > > To unsubscribe from this group, send email to > > django-users+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/django-users?hl=en. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@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.