为什么在django.forms.CharField中缺少"blank",但在django.db.models.CharField中存在?

8

背景

我有一个模型,其中两个字段设置为空:

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

问题在于我希望能够动态设置表单构建时的max_length,因此我有一个自定义表单:

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)                                                                                                                                                                 
            ]                                                                                                                                                                                                       
        )  

注意:这两个长度值实际上是从数据库中获取的,但我选择不包含该代码以使示例更短。

问题

当我使用这些自定义字段时,“空白”选项被覆盖/忽略了。

我尝试将max_length、widget和validators添加到现有字段中,像这样:

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)] 

在这样做时,blank选项是有效的,但动态max_length未应用于表单。

我试图查看django源代码,但我很新,所以现在接受不了这么多。

有没有什么办法可以实现这个?


3
你尝试在你的表单中添加required=False参数了吗? - Alagappan Ramu
@AlagappanRamu:没有,我没有。我太专注于寻找“空白”,以至于我在文档中可能错过了它。我在CharField创建中添加了required = False,问题得到了解决。请将您的评论作为答案编写,以便我可以接受并点赞。谢谢! - rzetterberg
1个回答

28

创建表单时,在CharField中除了max_length、widget和validators之外,还需添加以下参数:

forms.CharField(...,required = False)
在Django中,模型中的blank=True对应于表单中的required=False

服务器重启后就可以正常工作了(嗯,通常情况下会自动重新载入)。在Django 1.11中无法正常运行,仍然在Django管理员中询问。 - Hendy Irawan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接