2017-09-21 18 views
0

私はチュートリアルからDjangoのWebサイトを構築しています。モデルはポストと呼ばれ、次のようになりますされていますDjangoモデルブランク= Trueですが、sqlは常にNULLではありません

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を作りました。

移行/ SQL Djangoは今、このようなルックスを実行している:

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; 

それはちょうど空白値を無視し、すべてのフィールドは、NOT NULLになります。 これもこれを見ました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 %} 

答えて

0

BooleanFieldはそうNOT NULLは問題ではありません持つ、TrueまたはFalseを保存することができます願っています。

実際にnullをフィールドに使用する場合は、null=Trueが必要です。これはすでに持っているblank=Trueとは別のオプションです。

既にチェックボックスであるため、モデルフォームのブール値フィールドをオーバーライドする必要はありません。ただし、それを上書きする場合は、フィールドをオプションにする場合は、required=Falseを設定する必要があります。

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

ありがとうございますが、問題はフォームフィールドに「必須」を追加することです。それは問題です。私はより明確になるように質問を変えます。 – Sebastian

+0

これはあなたのモデルではなく、あなたのフォームの問題です。 – Alasdair

+0

あなたは正しかった、上書きが問題だった、ありがとう!私はnull =真とblaank =真のSQLと混同され、それがモデルの問題だと思った! – Sebastian

0
published = models.BooleanField(blank=True, verbose_name='Veröffentlichung') 

ソースドキュメントdjango model referencesこれはNULLとは異なること

注参照。 nullは純粋に データベース関連ですが、空白は検証に関連しています。フィールドに のblank = Trueが指定されている場合、フォームの検証によって空の値が入力されます。 フィールドに空白=偽がある場合は、フィールドが必要です。

フォームで

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

ソースRequred filed

その作業

+0

はい、理由は、なぜ私はいくつかのフィールドを空白にしていたので、「必須」のステータスはこれらに設定されません。しかし、それでもやはりそれらのフィールドは必須です。 – Sebastian

+0

フォームを追加することができます – Robert

関連する問題