2016-05-14 11 views
1

選択フィールドの空ラベルを設定すると問題が発生します。私はthisのような答えを見ましたが、これはちょうどフォームについて話しています。Django空のラベルの選択フィールド - クエリーセットなし

私は次のモデルがあるとします。

class MyColorModel(models.Model): 
    BLUE = 'blue' 
    RED = 'red' 
    GREEN = 'green' 
    COLOR_CHOICES = (
     (BLUE, 'Blue'), 
     (RED, 'Red'), 
     (GREEN, 'Green')) 

    my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=True) 

そして、このフォーム:デフォルトでは

class MyColorForm(forms.ModelForm): 
    class Meta: 
     model = MyColorModel 
     fields = ['mycolor'] 

を空白のラベルが-----に設定すると、これは、選択フィールドを表示します。 -

私はラベルを設定するために次のオプションを考え出しました。私モデル

COLOR_CHOICES = (
    ('', '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

2)変更COLOR_CHOICESへ:私のモデルにで

1)変更COLOR_CHOICESを

COLOR_CHOICES = (
    (None, '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

3)に次ののinitメソッドを追加します。私のモデルフォーム

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].choices = [('', '---Please select your color---')] + MyColorModel.COLOR_CHOICES 

オプション1は、それがうまく私のモデル(オプション2)に空のラベルを追加している私は失敗し始めた文ならば、それは2

オプションを作成するために私を導いたものだいくつかの副作用につながりましたか?私はそれを追加するか、フォームに追加する方がいいですか?フォームの中で空のラベルを設定するだけのコードがたくさんあるようです。

答えて

1

フォームに必要な設定を行うことで、目的を達成するより正確な方法です。 Djangoでは、モデルには、保存するデータの必須フィールドと動作が含まれています。つまり、データベース内での情報の構造を定義します。

1.私はそれをチェックしませんでしたが、あなたの最初の選択肢は空の文字列が、あなたの my_colorフィールド blank=True引数が含まれていないあるとして、あなたの最初のオプション
COLOR_CHOICES = (
    ('', '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

my_color = models.CharField(max_length=5, choices=COLOR_CHOICES) 

は、動作しない場合があります。つまり、空の文字列をデータベースに保存することはできません。しかし、このフィールドを必須にしたい場合は、空の選択肢の定義は、データ構造に関する追加情報を保持していないため、付加価値はありません。

2.あなたの目のオプションは間違いなく [1]を移動するための方法ではありません:空の文字列値は常に空の文字列として保存されますので、そのようなCharFieldですとTextFieldなどの文字列ベースのフィールドに ヌルを使用して

避け、ではありませんNULLとして。文字列ベースのフィールドにnull = Trueが指定されている場合は、「データなし」の2つの値(NULLおよび空の文字列)があることを意味します。ほとんどの場合、「データなし」の2つの値を持つことは冗長ですが、DjangoではNULLではなく空の文字列を使用します。

3. 3番目のオプションが良好です。私はdjangoフォームでしばらく働いていませんでしたが、コードが機能するならば、フォームはあなたのモデルでそれを行うよりもあなたのフォームがどのように見えるかを定義するより適切な場所です。

あなたの投稿にリンクされているSOの質問から解決策を見て、それらを実装してください。

幸運を祈る!

+0

ありがとうございます!あなたは正しいです、私はブランクが必要でした=オプション1のために真です。私はオプション2に行っていましたが、間違いなく他の人の1人を使用します。 – Johan

1

したがって、すべてのモデルフォームにempty_labelを設定しますか?選択肢に空のオプションを追加すると、それはdocsに記載されていても問題ありません。

フィールドに空白=偽が設定されていない限り、デフォルトで「012」が含まれるラベルが「---------」を含むラベルがレンダリングされます。 にこの動作をオーバーライドするには、Noneを含む選択肢にタプルを追加します。例えば (None、 'Your String for Display')。代わりに、 CharFieldなどで、これが意味を成す場所ではなく、空の 文字列をNoneの代わりに使用することもできます。

しかし、デフォルト値の表示を停止するには、blank=Falseを設定する必要があります。

class MyColorModel(models.Model): 
    BLUE = 'blue' 
    RED = 'red' 
    GREEN = 'green' 
    COLOR_CHOICES = (
     ('', '---Please select your color---') 
     (BLUE, 'Blue'), 
     (RED, 'Red'), 
     (GREEN, 'Green')) 

    my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=False, null=False, default='') 

しかし、私の意見では、それを行うための最善の方法は、単に form.fieldempty_labelを設定することです。だから、このような何かを試してみてください。

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].empty_label = '---Please select your color---' 
+0

答えをありがとう。私は実際には、最後のオプションとして行ったように空のラベルを設定する方が好きですが、モデルフィールドがForeignKeyフィールド(つまりモデルの選択フィールド)の場合にのみ動作するようです。私の場合、通常の選択フィールドに空のラベルを設定すると効果がありません(Django 1.9を使用) – Johan

+0

私はドキュメントでこれを読んでいますので、オプション1を使用します:空白= Falseがデフォルト値選択ボックスと共に "---------"を含むラベルがレンダリングされます。この動作をオーバーライドするには、Noneを含む選択肢にタプルを追加します。例えば(None、 'Your String for Display')。代わりに、CharFieldのように、Noneの代わりに空の文字列を使用することもできます。 – Johan

関連する問題