在Django模型中存储多选结果的正确方法

 飞翔1 发布于 2023-02-13 20:54

所有:

ModelCheckboxSelectMultiple小部件一起使用的静态数据正确的字段类型是什么?我收到验证错误,觉得我缺少一些简单的东西。

该应用程序是一个简单的Django 1.6应用程序,其中一个Campground对象可以具有多个对象eligible_days(例如,站点#123可能在星期一和星期二可用,而站点#456可以在星期三至星期五使用)。

因为它是静态数据,并且我已经准备好ManyToManyField有不必要的数据库开销,所以我尝试使用choices模型内部的定义来执行此操作,但是当我尝试保存时,会收到验证错误。请选择一个有效的选择。[u'5',u'6']不是可用的选择之一。每次。

Q1:是否必须重写/子类化字段以支持此操作?

Q2:是否需要自定义验证方法来支持此方法?

问题3:我是否会通过避免不必要的努力使自己变得困难ManyToManyField

谢谢您的帮助!/米

models.py

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()

管理员

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)

表格

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
        }

TAH.. 5

我知道这是一个古老的问题,但是对于那些希望避免使用ManyToManyField的人来说,有一个可以做到这一点的程序包django-multiselectfield,可以快速,轻松地实现。

表格

from multiselectfield import MultiSelectFormField

class MyForm(forms.ModelForm):
    my_field = MultiSelectFormField(choices=MyModel.MY_CHOICES)

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)

就是这样!它将MY_CHOICES的密钥存储在以逗号分隔的字符串中。简单!

1 个回答
  • 我知道这是一个古老的问题,但是对于那些希望避免使用ManyToManyField的人来说,有一个可以做到这一点的程序包django-multiselectfield,可以快速,轻松地实现。

    表格

    from multiselectfield import MultiSelectFormField
    
    class MyForm(forms.ModelForm):
        my_field = MultiSelectFormField(choices=MyModel.MY_CHOICES)
    

    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)
    

    就是这样!它将MY_CHOICES的密钥存储在以逗号分隔的字符串中。简单!

    2023-02-13 20:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有