django:如何从m2m字段的输入中选择字段?

时间:2016-10-28 20:49:10

标签: django django-models

很抱歉,如果标题没有多大意义。

假设我们有一个这样的模型设置:

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

1 个答案:

答案 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)