Why is "blank" is missing in django.forms.CharField, but present in django.db.models.CharField?

13,224

When creating your form, add the following parameter to CharField apart from the max_length, widget and validators:

forms.CharField(...,required = False)

In Django, blank=True in models correlates to required=False in forms.

Share:
13,224
rzetterberg
Author by

rzetterberg

An evolutionary algorithm in form of a human being.

Updated on July 27, 2022

Comments

  • rzetterberg
    rzetterberg almost 2 years

    Background

    I have a model with two fields that are set the blank:

    class News(models.Model):                                                                                                                                                                                           
        title = models.CharField(max_length = 50, blank = True)                                                                                                                                                         
        info = models.TextField(blank = True)
    

    The thing is that I want to set the max_length dynamically when the form is built, so I have a custom form:

    class NewsForm(forms.ModelForm):                                                                                                                                                                                    
        def __init__(self, *args, **kwargs):                                                                                                                                                                            
            super(NewsForm, self).__init__(*args, **kwargs)                                                                                                                                                             
    
            title_max_length = 20                                                                                                                                                                                       
            info_max_length = 100                                                                                                                                                                                       
    
            self.fields["title"] = forms.CharField(max_length = title_max_length)                                                                                                                                       
            self.fields["info"] = forms.CharField(                                                                                                                                                                      
                widget = forms.Textarea,                                                                                                                                                                                
                validators = [                                                                                                                                                                                          
                    MaxLengthValidator(info_max_length)                                                                                                                                                                 
                ]                                                                                                                                                                                                       
            )  
    

    Note: Those two length values are actually fetched from the database, but I chose not to include that code to keep the examples shorter.

    The problem

    When I'm using those custom fields the blank option is overwritten/ignored.

    I tried just adding the max_length, widget and validators to the existing fields, like this:

    class NewsForm(forms.ModelForm):                                                                                                                                                                                    
        def __init__(self, *args, **kwargs):                                                                                                                                                                            
            super(NewsForm, self).__init__(*args, **kwargs)                                                                                                                                                             
    
            title_max_length = 20                                                                                                                                                                                       
            info_max_length = 100                                                                                                                                                                                       
    
            self.fields["title"].max_length = title_max_length                                                                                                                                                          
            self.fields["info"].widget = forms.Textarea                                                                                                                                                                 
            self.fields["info"].validators = [MaxLengthValidator(info_max_length)] 
    

    When doing this the blank option works, but the dynamic max_length is not applied to the form.

    I tried to look in the django source, but I'm quite new so it's too much to take in right now.

    Is there some way I can achieve this?

  • Hendy Irawan
    Hendy Irawan over 6 years
    <del>not working for me in Django 1.11, still asks in django admin</del> Works after server restart (hmm, it usually auto-reloads)