zardon zardon - 6 months ago 156
Python Question

(Django) Trim whitespaces from charField

How do I strip whitespaces (trim) from the end of a charField in Django?

Here is my Model, as you can see I've tried putting in clean methods but these never get run.

I've also tried doing

name.strip()
,
models.charField().strip()
but these do not work either.

Is there a way to force the charField to trim automatically for me?

Thanks.

from django.db import models
from django.forms import ModelForm
from django.core.exceptions import ValidationError
import datetime

class Employee(models.Model):
"""(Workers, Staff, etc)"""
name = models.CharField(blank=True, null=True, max_length=100)

def save(self, *args, **kwargs):
try:
# This line doesn't do anything??
#self.full_clean()
Employee.clean(self)
except ValidationError, e:
print e.message_dict

super(Employee, self).save(*args, **kwargs) # Real save

# If I uncomment this, I get an TypeError: unsubscriptable object
#def clean(self):
# return self.clean['name'].strip()

def __unicode__(self):
return self.name

class Meta:
verbose_name_plural = 'Employees'

class Admin:pass


class EmployeeForm(ModelForm):
class Meta:
model = Employee

# I have no idea if this method is being called or not
def full_clean(self):
return super(Employee), self.clean().strip()
#return self.clean['name'].strip()


Edited: Updated code to my latest version. I am not sure what I am doing wrong as it's still not stripping the whitespace (trimming) the name field.

Answer

Model cleaning has to be called (it's not automatic) so place some self.full_clean() in your save method.
http://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.full_clean

As for your form, you need to return the stripped cleaned data.

return self.cleaned_data['name'].strip()

Somehow I think you just tried to do a bunch of stuff that doesn't work. Remember that forms and models are 2 very different things.

Check up on the forms docs on how to validate forms http://docs.djangoproject.com/en/dev/ref/forms/validation/

super(Employee), self.clean().strip() makes no sense at all!

Here's your code fixed:

class Employee(models.Model):
    """(Workers, Staff, etc)"""
    name = models.CharField(blank=True, null=True, max_length=100)

    def save(self, *args, **kwargs):
        self.full_clean() # performs regular validation then clean()
        super(Employee, self).save(*args, **kwargs)


    def clean(self):
        """
        Custom validation (read docs)
        PS: why do you have null=True on charfield? 
        we could avoid the check for name
        """
        if self.name: 
            self.name = self.name.strip()


class EmployeeForm(ModelForm):
    class Meta:
        model = Employee


    def clean_name(self):
        """
        If somebody enters into this form ' hello ', 
        the extra whitespace will be stripped.
        """
        return self.cleaned_data.get('name', '').strip()