Opened 9 years ago

Closed 9 years ago

#4733 closed (invalid)

Allowing blank inserts in models.Charfield

Reported by: Ceschiatti Owned by: adrian
Component: Validators Version: master
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:


A have a model wieh a models.Charfield. Django is allowing my app to insert a model with this field blank, even if I put the option blank = False in it (though the default is False). I'm using version 0.97-pre (SVN).

Change History (4)

comment:1 Changed 9 years ago by mtredinnick

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

What steps are you taking to trigger this behaviour? Please provide a step-by-step example, since I can't repeat it with normal actions.

Note that if you just put an empty string into the field and then call save() on the model without doing any validation, that is not a bug, since save() does not do any validation by design (so that save() will never raise a validation error).

comment:2 Changed 9 years ago by Simon G. <dev@…>

  • Resolution set to invalid
  • Status changed from new to closed

marked as invalid until the requested info is provided.

comment:3 Changed 9 years ago by oliver.andrich@…

  • Resolution invalid deleted
  • Status changed from closed to reopened

I have exactly the same beaviour on my model and consider it a serious bug to be honest. Here is how I can reproduce it.

Here is my model I use. It even doesn't matter if I use blank=False on the name attribute.

class Project(models.Model):
  name        = models.CharField(_('Projektname'), max_length = 255)
  description = models.TextField(_('Beschreibung'), max_length = 64000, blank=True)
  active      = models.BooleanField(_('Aktiv?'), default = True)
  owner       = models.ForeignKey(User, verbose_name=_('Eigent&uuml;mer'))

  class Meta:
    unique_together     = [('name', 'owner')]
    verbose_name        = _('Projekt')
    verbose_name_plural = _('Projekte')
    ordering            = ['name']

  class Admin:
    fields              = [(None, { 'fields': ('name', 'owner', 'description', 'active') })]
    list_display        = ['owner', 'name', 'active']
    list_display_links  = ['name']
    list_filter         = ['active']
    search_fields       = ['name']

  def __unicode__(self):

And here is what I get in an interactive session.

>>> u = User.objects.get(username__exact="oa")
>>> p = Project(owner = u)
>>> p.validate()
{'name': [u'This field is required.']}

This must be an error in my eyes, cause it lets you insert invalid data into the database using the ORM, but prohibit it through the admin interface. And it can't also be DRY to actually require a call for validate before a save. At least that is, what I expect from it. ;)

I am also using the SVN version of Django.

comment:4 Changed 9 years ago by mtredinnick

  • Resolution set to invalid
  • Status changed from reopened to closed

Validation and saving are intentionally separate, as noted elsewhere. The behaviour you are seeing is consistent with this design constraint and so this is not a bug, in that respect.

With the new validation code that is being added soon, I think we decided on some sort of option to have a save-and-validate all in one step, but I can't remember for sure. It won't be compulsory, but a shortcut might exist.

For right now, though, this remains "not a bug". Please don't reopen it just because you happen not to agree with that.

Note: See TracTickets for help on using tickets.
Back to Top