很抱歉,如果标题没有多大意义。
假设我们有一个这样的模型设置:
class Sample(models.Model):
name = models.CharField(max_length=300)
def __str__(self):
return self.name
class Project(models.Model):
description = models.CharField(max_length = 200, null=True)
sample = models.ManyToManyField(Sample)
class SampleLogoutRecord(models.Model):
project = models.ForeignKey(Project, on_delete = models.CASCADE, null=True)
sample_choice = models.CharField(max_length = 200, null=True, choices = SAMPLE_CHOCIES)
logout_date = models.DateField(null=True)
logout_by = models.CharField(max_length = 200, null=True)
所以基本上有主模型项目,其中包含与几个样本相关的m2m现场样本。然后SampleLogoutRecord是项目的外键,它是属于该项目的特定样本的记录,已注销。我的问题是,如何设置sample_choice以便此选择字段使用属于此项目的那些样本作为选项?
例如,如果项目A包含样本1,2和3.我希望sample_choice是一个带有选项的选项字段:1,2和3。
从官方文档看,选择字段的选择似乎是可调用的,返回2元组列表。这听起来像我应该做的但是我一直坚持实际实现这一点。
TIA
答案 0 :(得分:0)
在表单的init方法中,填充数据库值中的选项:
class SampleLogoutRecordForm(forms.ModelForm):
def __init__(self, project, args, **kwargs):
super(SampleLogoutRecordForm, self).__init__(*args, **kwargs)
self.fields['sample_choice'].choices = [
(x.id, x.name) for x in project.sample.all()
]
self.project = project
def save(self, *args, **kwargs):
""" Assign the project here """
logout_record = super(SampleLogoutRecordForm, self).save(*args, **kwargs, commit=False)
logout_record.project = self.project
logout_record.save()
return logout_record
class Meta:
model = Article
fields = ['sample_choice', 'logout_date', 'logout_by']
在您的视图中,使用额外的project
参数实例化表单,包括在POST请求处理位中。
if request.method == 'POST':
form = SampleLogoutRecordForm(project, request.POST)
if form.is_valid():
record = form.save()
# now do stuff to redirect
else:
form = SampleLogoutRecordForm(project)