Opened 10 years ago

Closed 9 years ago

#4733 closed (invalid)

Allowing blank inserts in models.Charfield

Reported by: Ceschiatti Owned by: Adrian Holovaty
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 10 years ago by Malcolm Tredinnick

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: invalid
Status: newclosed

marked as invalid until the requested info is provided.

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

Resolution: invalid
Status: closedreopened

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 Malcolm Tredinnick

Resolution: invalid
Status: reopenedclosed

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