mri*_*her 1 django django-models django-forms
所有:
Model与CheckboxSelectMultiple小部件一起使用的静态数据正确的字段类型是什么?我收到验证错误,觉得我缺少一些简单的东西。
该应用程序是一个简单的Django 1.6应用程序,其中一个Campground对象可以具有多个对象eligible_days(例如,站点#123可能在星期一和星期二可用,而站点#456可以在星期三至星期五使用)。
因为它是静态数据,并且我已经准备好ManyToManyField有不必要的数据库开销,所以我尝试使用choices模型内部的定义来执行此操作,但是当我尝试保存时,会收到验证错误。请选择一个有效的选择。[u'5',u'6']不是可用的选择之一。每次。
ManyToManyField?谢谢您的帮助!/米
class CampgroundQuery(models.Model):
SUN = 0
MON = 1
TUE = 2
WED = 3
THU = 4
FRI = 5
SAT = 6
DAYS_OF_WEEK_CHOICES = (
(SUN, 'Sunday'),
(MON, 'Monday'),
(TUE, 'Tuesday'),
(WED, 'Wednesday'),
(THU, 'Thursday'),
(FRI, 'Friday'),
(SAT, 'Saturday'),
)
# loads choices from defined list
eligible_days = models.CharField(max_length=14,choices=DAYS_OF_WEEK_CHOICES,
blank=False, default='Saturday')
campground_id = models.SmallIntegerField()
stay_length = models.SmallIntegerField()
start_date = models.DateField()
end_date = models.DateField()
Run Code Online (Sandbox Code Playgroud)
from django.contrib import admin
from searcher.models import CampgroundQuery
from forms import CampgroundQueryAdminForm
class CampgroundQueryAdmin(admin.ModelAdmin):
form = CampgroundQueryAdminForm
admin.site.register(CampgroundQuery, CampgroundQueryAdmin)
Run Code Online (Sandbox Code Playgroud)
from django import forms
from django.contrib import admin
from searcher.models import CampgroundQuery
class CampgroundQueryAdminForm(forms.ModelForm):
class Meta:
model = CampgroundQuery
widgets = {
'eligible_days': forms.widgets.CheckboxSelectMultiple
}
Run Code Online (Sandbox Code Playgroud)
ManyToManyField 是正确的选择。
理论上,您可以创建一个紧凑的表示形式,例如包含“M,W,Th”等表示形式的字符串字段或您将设置并解释为七个二进制位的整数,但这都是一个巨大的麻烦。ManyToManyFields 很好。
我知道这是一个古老的问题,但是对于那些希望避免使用ManyToManyField的人来说,有一个可以做到这一点的程序包django-multiselectfield,可以快速,轻松地实现。
表格
from multiselectfield import MultiSelectFormField
class MyForm(forms.ModelForm):
my_field = MultiSelectFormField(choices=MyModel.MY_CHOICES)
Run Code Online (Sandbox Code Playgroud)
models.py
from multiselectfield import MultiSelectField
class MyModel(models.Model):
MY_CHOICES = (
('a', "A good choice"),
...
('f', "A bad choice"),
)
my_field = MultiSelectField(choices=MY_CHOICES, max_length=11)
Run Code Online (Sandbox Code Playgroud)
就是这样!它将MY_CHOICES的密钥存储在以逗号分隔的字符串中。简单!
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |