如何将数据从 ManyToManyField 放入 MultipleChoiceField 中的选项



我有一个表格:

*# dialogues.forms*
class CreateConferenceForm(forms.Form):
    ...
    participants = forms.MultipleChoiceField(choices=?)
    ...

我需要在这个模型中输入选择参数而不是来自朋友字段的"?"数据:

*# persons.models*
class Person(User):
    ...
    friends = models.ManyToManyField(
        'self',
        related_name='+',
    ) 
    ...

我该怎么做?

如果你用你的表单创建一个会议模型的实例,你应该考虑使用 Django 的 ModelForm ,它旨在用于创建和编辑模型实例。

无论哪种情况,您都可以使用 ModelMultipleChoiceField 来实现您的目的,它只是一个由查询集支持的MultipleChoiceField,用于其选择。您可以在标准FormModelForm中使用此字段。

若要根据请求自定义选项,可以在视图中设置查询集。

例如:

forms.py

class CreateConferenceForm(forms.Form):
    # An initial queryset is required, this is overwritten in the view
    participants = forms.ModelMultipleChoiceField(Person.objects.all())

views.py

def new_conference(request):
    data = request.POST if request.method == 'POST' else None
    conference_form = CreateConferenceForm(data=data)
    conference_form.fields['participants'].queryset = my_person.friends.all()
    if data:
        if conference_form.is_valid():
            # etc
    return render...

请注意,在对表单调用is_valid之前设置查询集非常重要,因为查询集用于验证,并且在将表单传递到模板之前设置查询集,因为查询集用于生成显示的选项。

你可以

试试这个

class CreateConferenceForm(forms.Form):
    """
    """
    participants = forms.MultipleChoiceField()
    def __init__(self, *args, **kwargs):
        # Pass the request in the form.
        self.request = kwargs.pop('request', None) 
        super(CreateConferenceForm, self).__init__(*args, **kwargs)
        if self.request:
            pass
        # Get the person object according to you need. Whether from request or hard-coded.
        person = Person.objects.filter().first()
        friend_choices = [(dct['id'], dct['id']) for dct in (person.friends.values('id'))]
        self.fields['participants'].choices = friend_choices
作为

朋友字段对象也是人作为MamyToMany与自我。 你也可以试试这个

class CreateConferenceForm(forms.Form):
    """
    """
    # Replace second 'id' in values_list('id', 'id') with the field in you person model.
    participants = forms.MultipleChoiceField(choices=list(Person.objects.filter().values_list('id', 'id')))

相关内容

  • 没有找到相关文章

最新更新