我有一个表格:
*# 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
,用于其选择。您可以在标准Form
或ModelForm
中使用此字段。
若要根据请求自定义选项,可以在视图中设置查询集。
例如:
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')))