Приложение работает с ModelChoiceField, но не работает с ModelMultipleChoiceField - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь получить входные данные пользователя на странице Django.Но я не могу выбрать поле с множественным выбором.Я пробовал несколько альтернатив без облегчения.

  • self.fields ['site']. Queryset = forms.ModelMultipleChoiceField (queryset = sites.objects.all ())

  • self.fields ['site'] = forms.ModelChoiceField (queryset = sites.objects.filter (project_id = project_id))

  • self.fields ['site']. queryset = forms.MultipleChoiceField (widget = forms.SelectMultiple, choices = [(p.id, str (p)) для p в sites.objects.filter (project_id = project_id)])

forms.py

class SearchForm (forms.Form):

class Meta:
    model= images
    fields=['site']

def __init__(self,*args,**kwargs):
    project_id = kwargs.pop("project_id")     # client is the parameter passed from views.py
    super(SearchForm, self).__init__(*args,**kwargs)
    self.fields['site'] = forms.ModelChoiceField(queryset=sites.objects.filter(project_id=project_id))

views.py

def site_list (request, project_id):

form = SearchForm(project_id=project_id)
site_list = sites.objects.filter(project__pk=project_id).annotate(num_images=Count('images'))
template = loader.get_template('uvdata/sites.html')

if request.method == "POST":
    image_list=[]
    form=SearchForm(request.POST,project_id=project_id)
    #form=SearchForm(request.POST)
    #site_name=request.POST.get('site')
    if form.is_valid():
        site_name=form.cleaned_data.get('site')
        print(site_name)

Я ожидаю получить поле множественного выбора, но в итоге получаю эту ошибку:

Значение исключения:

'site'

Местоположение исключения: /home/clyde/Downloads/new/automatic_annotator_tool/django_app/search/forms.py в init , строка 18 (строка 18: self.fields ['site']. queryset = forms.MultipleChoiceField (виджет= forms.SelectMultiple, choices = [(p.id, str (p)) для p в sites.objects.filter (project_id = project_id)]))

1 Ответ

0 голосов
/ 05 июля 2019

Вы неправильно определяете свою форму. Документация показывает, как это сделать.

В вашем случае это будет примерно так:

class SearchForm(forms.Form):

    site = forms.ModelMultipleChoiceField(queryset=Sites.object.none())

    def __init__(self,*args,**kwargs):
        project_id = kwargs.pop("project_id")
        super(SearchForm, self).__init__(*args,**kwargs)
        self.fields['site'].queryset = Sites.objects.filter(project_id=project_id))

Вы также, кажется, путаете обычные Form и ModelForm, поскольку Meta.model используется только в ModelForm, тогда как вы используете обычный Form. Я предлагаю вам прочитать разницу в документации, прежде чем продолжить.

...