2017-01-18 10 views
0

У меня есть форма:Как поместить данные из ManyToManyField на выбор в MultipleChoiceField

*# dialogues.forms* 

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

И мне нужно поставить в выборе аргумента вместо «?» данные из подруг в этой модели:

*# persons.models* 

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

Как это сделать?

+0

Вы уверены, что хотите использовать обычную форму вместо 'ModelForm'? –

+0

Как вы получаете экземпляр 'Person'? Это действующий пользователь или есть ли другое поле для этого? – 4140tm

+0

Человек - действующий пользователь - да. Я не уверен, что использую обычную форму из-за большей гибкости, чем ModelForm, но теперь я решил использовать ModelForm, это действительно подходит для моих целей, спасибо! –

ответ

1

Если вы создаете экземпляр модели конференции с вашей формой, вы должны рассмотреть возможность использования Django's 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... 

Обратите внимание, что это важно для вас, чтобы установить QuerySet перед вызовом is_valid на форме, так как запрос используется в валидации и перед отправкой передачи формы в шаблон, поскольку набор запросов используется для генерации показанных вариантов.

+0

Спасибо, это работает! Я решил использовать ModelForm и трюк с form.fields ['members']. Queryset вместе. –

0

Вы можете попробовать это

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 

В качестве объектов друг поля также Person, как 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'))) 
+0

Благодарим вас за ответ. Я не знал об этих возможностях, поэтому спасибо, что поделился своими знаниями. –