为啥 django.forms.CharField 中缺少“空白”,但在 django.db.models.CharField 中存在?

Posted

技术标签:

【中文标题】为啥 django.forms.CharField 中缺少“空白”,但在 django.db.models.CharField 中存在?【英文标题】:Why is "blank" is missing in django.forms.CharField, but present in django.db.models.CharField?为什么 django.forms.CharField 中缺少“空白”,但在 django.db.models.CharField 中存在? 【发布时间】:2013-04-30 13:41:31 【问题描述】:

背景

我有一个模型有两个字段设置为空白:

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

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

问题

当我使用这些自定义字段时,blank 选项将被覆盖/忽略。

我尝试将 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"].max_length = title_max_length                                                                                                                                                          
        self.fields["info"].widget = forms.Textarea                                                                                                                                                                 
        self.fields["info"].validators = [MaxLengthValidator(info_max_length)] 

执行此操作时,blank 选项有效,但动态 max_length 不会应用于表单。

我试图查看 django 源代码,但我很新,所以现在无法接受。

有什么方法可以实现吗?

【问题讨论】:

您是否尝试在表单中添加 required=False 参数? @AlagappanRamu:不,我没有。我非常专注于寻找“空白”,以至于我在文档中错过了它。我在CharField 创建中添加了required = False,这解决了问题。写下您的评论作为答案,以便我接受并投票。谢谢! 【参考方案1】:

创建表单时,除了max_length、小部件和验证器之外,将以下参数添加到CharField

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

在 Django 中,模型中的 blank=True 与表单中的 required=False 相关。

【讨论】:

在 Django 1.11 中不适合我,仍然在 django admin 中询问 在服务器重启后工作(嗯,它通常会自动重新加载)

以上是关于为啥 django.forms.CharField 中缺少“空白”,但在 django.db.models.CharField 中存在?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?