

Django 1.6のModelを使ってます。  
複数選択でなおかつ、任意の値を入れたいです。

公式ドキュメントから拝借しましたが、  
choicesを使えば以下のように複数選択できます

[code]

    from django.db import models
    
    class Person(models.Model):
        GENDER_CHOICES = (
            (u'M', u'Male'),
            (u'F', u'Female'),
        )
        name = models.CharField(max_length=60)
        gender = models.CharField(max_length=2, choices=GENDER_CHOICES)
    
[/code]

しかし、これだとMとF以外にも「u'未回答'」みたいなのをユーザ側で入れたいときに  
入力ができません。  
これを実現するには、やはりテンプレート側をカスタマイズするしかないでしょうか？


CC BY-SA 3.0
2015-03-05T10:13:16.400
7481
2017-03-15T08:14:58.063
7934
question
python django
DjangoのModelでchoicesでなおかつ任意の値を入れる場合


`default=None`（または、u'未回答')にしちゃいば、いくのでは？

[code]

    gender = models.CharField(max_length=2, 
                              default=u'未回答',
                              choices=GENDER_CHOICES)
    
[/code]

あと、`u'未回答'`は、`gender`入力可能な値であれば、`GENDER_CHOICES`に入れるべきですね。

[code]

    GENDER_CHOICES = (
        (u'M', u'Male'),
        (u'F', u'Female'),
        (u'N', u'未回答'),
    )
    
[/code]


CC BY-SA 3.0
2015-03-10T01:22:45.240
7683
2015-03-10T01:22:45.240
2314
7481
answer


「複数選択でなおかつ、任意の値を入れたい」という要望（いわゆるコンボボックス）は、datalistタグをサポートしているWebブラウザ上であれば、datalistタグを使用することで実現できます。

しかし、datalistタグ自体はDjango1.6ではサポートしていない（現行最新の1.10も同様）ので、カスタムウィジェットやテンプレートで対応する必要があります。  
本家Stackoverflowで
[カスタムウィジェットを定義して実現している回答](https://stackoverflow.com/a/32791625/1885815)
がありましたので、参考にしてみてください。  
この場合、ModelはDBに任意の値を保存する必要があるので、`django.db.models.CharField` に `choices`
パラメータを渡す必要はありません。

残念ながら、
[2017/3現在はSafariがdatalistタグをサポートしていない](https://www.w3schools.com/tags/tag_datalist.asp)
ようですので、Safariをサポートする場合はJavaScriptで実現する必要があります。  
[awesomeplate](https://leaverou.github.io/awesomplete/) などの採用を検討してみてください。


CC BY-SA 3.0
2017-03-15T08:04:22.950
33338
2017-03-15T08:14:58.063
2017-05-23T12:38:55.250
-1
3481
7481
answer