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

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

问题

当我使用这些自定义字段时,该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 源代码,但我很新,所以现在接受的内容太多了。

有什么方法可以实现吗?

4

1 回答 1

28

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

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

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

于 2013-05-07T08:22:29.433 回答