我一直试图将ManyToMany-Relation呈现为ModelChoiceField而不是ModelMultipleChoiceField。所以我尝试了以下(简化)操作:

models.py:

class Project(models.Model):
    name = models.CharField(max_length=20, unique=True)
    manager = models.ManyToManyField(User, related_name="manager_related")

forms.py:

class ProjectForm(forms.ModelForm):
    manager = forms.ModelChoiceField(queryset=User.objects.all(),
                               empty_label='Choose Manager', required=False)

    class Meta:
        model = Project
        fields = ['name', 'manager']


表单呈现正确,我可以从列表中选择一个注册用户。但是提交表单后,我会得到一个TypeError和消息'User' object is not iterable。我认为save()函数需要两个值来保存ManyToMany-Relation,但是ModelChoiceField仅返回一个。我不知道该怎么解决...

最佳答案

您可以通过更改小部件来解决此问题:

forms.py:

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ['name', 'manager']
        widgets = {
            'manager': forms.Select(),
        }


Select小部件是ModelChoiceField的默认小部件,并且Django适当地呈现了它:


  ModelChoiceField
  
  class ModelChoiceField(** kwargs)
  
  默认小部件:Select


或者,您可以使用SelectMultipleCheckboxSelectMultiple

10-08 02:20