【问题标题】:Django model blank=True, but sql always NOT NULLDjango模型空白=真,但sql总是NOT NULL
【发布时间】:2018-03-02 21:45:26
【问题描述】:

我正在根据教程构建 Django 网站。该模型称为 Post,如下所示:

class Post(models.Model):
   author = models.ForeignKey('auth.User', verbose_name='Author')
   title = models.CharField(max_length=200, verbose_name='Titel')
   text = HTMLField()
   created_date = models.DateTimeField(default=timezone.now, verbose_name='Erstellungsdatum')
   published = models.BooleanField(blank=True, verbose_name='Veröffentlichung')
   tags = models.ManyToManyField(Tag, blank=True)

   class Meta:
       verbose_name = 'Artikel'
       verbose_name_plural = 'Artikels'
       ordering = ['-created_date']

   def publish(self):
       self.published = True
       self.save()

   def __str__(self):
       return self.title

如你所见,我创建了一些字段blank=True

django 现在执行的迁移/sql 如下所示:

ALTER TABLE "blog_post" RENAME TO "blog_post__old";
CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
"published" bool NOT NULL, "title" varchar(200) NOT NULL, "text" text NOT 
NULL, "created_date" datetime NOT NULL, "author_id" integer NOT NULL 
REFERENCES "auth_user" ("id"));
INSERT INTO "blog_post" ("id", "title", "text", "created_date", "author_id", 
"published") SELECT "id", "title", "text", "created_date", "author_id", 
"published" FROM "blog_post__old";
DROP TABLE "blog_post__old";
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
COMMIT;

它只是忽略空白值并使每个字段都不为空。 我在question 也看到了这一点

问题是,如果我在模板中实现表单,则此字段是“必填”输入,因此如果未选中复选框,则无法提交表单。

提前致谢!

forms.py

from django import forms
from tinymce.widgets import TinyMCE

from .models import Post

class PostForm(forms.ModelForm):

    text = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30, 'class': 'materialize-textarea'}))
    published = forms.BooleanField(widget=forms.CheckboxInput())

    class Meta:
        model = Post
        fields = ('title', 'published', 'text', 'tags')

模板

{% extends 'blog/base.html' %}

{% block content_block %}
    <div class="row">
        <h1>Edit Post</h1>
    </div>

<div class="row">
    <form class="col s12" action="" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="waves-effect waves-light btn"><i class="material-icons left">save</i>Speichern</button>
    </form>
</div>

{% endblock %}

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:
    published = models.BooleanField(blank=True, verbose_name='Veröffentlichung')
    

    来源参考文档django model references

    请注意,这与 null 不同。 null 纯粹是 与数据库相关,而空白与验证相关。如果一个字段有 空白=真,表单验证将允许输入空值。如果一个 字段有空白=假,该字段将是必需的。

    在您的表单中

    published = forms.BooleanField(required=False,widget=forms.CheckboxInput())
    

    来源Requred filed

    希望它的工作

    【讨论】:

    • 是的,这就是为什么我将几个字段设为空白=True,因此不会在这些字段上设置“必需”状态。但不知何故,这些字段仍然是必需的。
    • 可以添加表单吗
    【解决方案2】:

    BooleanField 可以存储TrueFalse,因此拥有NOT NULL 不是问题。

    如果你真的想为一个字段允许null,那么你需要null=True。这是与您已有的 blank=True 不同的选项。

    您不需要覆盖模型表单中的布尔字段,因为它已经是一个复选框。但是,如果您确实覆盖它,那么如果您希望该字段是可选的,则需要设置 required=False

    published = forms.BooleanField(widget=forms.CheckboxInput(), required=False)
    

    【讨论】:

    • 谢谢,但问题是它在我的表单字段中添加了“必需”。那就是问题所在。我将更改我的问题,以便更清楚。
    • 这是你的表单的问题,而不是你的模型。
    • 你是对的,覆盖是问题所在,非常感谢!我对sql中的null=True和blaank=True感到困惑,并认为这是模型的问题!
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2018-08-03
    • 2011-08-11
    • 2020-06-11
    • 1970-01-01
    • 2012-01-27
    • 2010-10-25
    相关资源
    最近更新 更多