http://docs.djangoproject.com/en/dev/ref/models/fields/#choices
我已经阅读了文档,这意味着使用数据库表来获取动态数据,但它说明了
选择适用于静态数据,如果有的话,变化不大。
那么如果我想使用选项,但是选择多个,因为我使用的数据非常静态,例如一周中的几天。
无论如何都没有数据库表来实现这个目标吗?
答案 0 :(得分:5)
ChoiceField并不适合多种选择,而是使用ManyToManyField。忽略现在可以使用Choices而不是ForeignKey来获取静态数据的事实。如果结果是一个性能问题,有一些方法可以用不同的方式表示(一种是二元掩码方法),但它们需要更多的工作。
答案 1 :(得分:4)
这对我有用:
1)创建一个Form类并设置一个属性,以便为MultipleChoiceField提供静态选择
from django import forms from myapp.models import MyModel, MYCHOICES class MyForm(forms.ModelForm): myfield = forms.MultipleChoiceField(choices=MYCHOICES, widget=forms.SelectMultiple) class Meta: model = MyModel
2)然后,如果您正在使用管理界面,请在您的管理类中设置表单属性,以便山雀将使用您的自定义表单
from myapp.models import MyModel from myapp.forms import MyForm from django.contrib import admin class MyAdmin(admin.ModelAdmin): form = MyForm admin.site.register(MyModel, MyAdmin)
答案 2 :(得分:1)
尝试以下配置。在models.py
class MyModel(models.Model):
my_choices = models.TextField(help_text="It's a good manners to write it")
forms.py
中的
CHOICES = ((1,1), (2,2))
class MyForm(forms.ModelForm):
my_choices = forms.MultipleChoiceField(choices=CHOICES)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
# maybe you can set initial with self.fields['my_choices'].initial = initial
# but it doesn't work wity dynamic choices
obj = kwargs.get('instance')
if obj:
initial = [i for i in obj.my_choices.split(',')]
self.initial['my_choices'] = initial
def clean_lead_fields(self):
return ','.join(self.cleaned_data.get('my_choices', []))
admin.py
中的
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm