首先让我说我正在使用遗留数据库,因此避免使用自定义中间表是不可取的。
我正在寻找另一种获取limit_choices_to
功能的方法,因为我只需要在我的ModelForm中的sample_option
模型中显示由Sampletype
布尔值标记的选项:< / p>
class PlanetForm(ModelForm):
class Meta:
model = Planet
fields = ['name', 'samples']
以下是我的模型的简化视图
class Planet(models.Model):
name= models.CharField(unique=True, max_length=256)
samples = models.ManyToManyField('Sampletype', through='Sample')
class Sample(models.Model):
planet = models.ForeignKey(Planet, models.DO_NOTHING)
sampletype = models.ForeignKey('Sampletype', models.DO_NOTHING)
class Sampletype(models.Model):
name = models.CharField(unique=True, max_length=256)
sample_option = models.BooleanField(default=True)
Sample
是中间表。
通常,如果项目首先使用Django启动,我可以将ManyToManyField声明定义为:
samples = models.ManyToManyField('Sampletype', limit_choices_to={'sample_option'=True})
但这不是一个选择..那么我该如何获得这个功能呢? Django在他们的文档中明确指出:
在具有a的ManyToManyField上使用时,limit_choices_to无效 使用through参数指定的自定义中间表。
但是当你有自定义中间表时,他们没有提供有关如何获得该限制的信息。
我尝试在limit_choices_to
模型的ForeignKey
上设置Sample
选项,如下所示:
sampletype = models.ForeignKey('Sampletype', models.DO_NOTHING, limit_choices_to={'sample_option': True})
但这没有效果。
奇怪的是,我在网上找不到答案,显然其他人必须在他们的项目中做到这一点所以我猜测解决方案很简单,但我无法理解。
提前感谢您的任何帮助或建议。
答案 0 :(得分:2)
您可以在表单的__init__
方法中设置选项:
class PlanetForm(ModelForm):
class Meta:
model = Planet
fields = ['name', 'samples']
def __init__(self, *args, **kwargs):
super(PlanetForm, self).__init__(*args, **kwargs)
sample_choices = list(
Sampletype.objects.filter(sample_option=True).values_list('id', 'name')
)
# set these choices on the 'samples' field.
self.fields['samples'].choices = sample_choices