Приложение работает с ModelChoiceField, но не работает с ModelMultipleChoiceField
Я пытаюсь получить пользовательские входные данные на странице Django. Но я не могу выбрать поле с множественным выбором. Я пробовал несколько альтернатив без облегчения.
self.fields [ 'сайт']. 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
Класс 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)
Я ожидаю получить поле множественного выбора, но в итоге получаю эту ошибку:
Значение исключения:
"Сайт"
Местоположение исключения: /home/clyde/Downloads/new/automatic_annotator_tool/django_app/search/forms.py в строке инициализации18 (строка 18:self.fields['site']. Queryset = forms.MultipleChoiceField(widget=forms.SelectMultiple), выборы =[(p.id, str(p)) для p в sites.objects.filter(project_id=project_id)]))
1 ответ
Вы не определяете свою форму правильно. Документация показывает вам, как это сделать.
В вашем случае это будет примерно так:
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
, Я предлагаю вам прочитать разницу в документации, прежде чем продолжить.