2016-10-28 109 views
0

对不起,如果标题没有多大意义。django:如何从m2m字段的入口选择字段进行选择?

比方说,我们有一个模型建立这样的:

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

在窗体的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)