@EgorLee

Как нормально ограничить выпадающий список в форме?

Я пытаюсь ограничить выпадающий список (показывает только поля относящиеся к конкретному user), я сделал это так:

forms.py:

class BookmarksForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(BookmarksForm, self).__init__(*args, **kwargs)
        self.fields['folder'].queryset = Folders.objects.filter(user=user)

    class Meta:
        model = Bookmarks
        fields = ('link', 'folder')


views.py:

def bookmarks(request):

    if request.method == 'POST' and 'create_folder' in request.POST:    # форма создания папки
        form = FolderForm(request.POST)
        f = form.save(commit=False)
        user = User.objects.get(id=request.user.id)
        f.user = user
        if form.is_valid():
            print('here')
            f.save()
            return redirect('bookmarks')
        else:
            form.add_error(None, 'Ошибка добавления папки')

    elif request.method == 'POST' and 'create_bm' in request.POST:  # форма создания закладки
        form = BookmarksForm(request.POST)
        f = form.save(commit=False)
        try:
            title = get_name_site(f.link)
            f.name = title
        except:
            f.name = f.link
        if form.is_valid():
            f.save()
            return redirect('bookmarks')
        else:
            form.add_error(None, 'Ошибка добавления закладки')
    else:
        folder_form = FolderForm()
        bookmarks_form = BookmarksForm(user=request.user.id)
        folder = Folders.objects.filter(user=request.user.id)
        fastlink = Fastlinks.objects.filter(user=request.user.id)
    return render(request, 'mainapp/bookmarks.html', {'title': 'закладки', 'folder_form': folder_form, 'bm_form': bookmarks_form, 'folders': folder, 'fl': fastlink})


Сейчас список отображается корректно, но при отправке формы выдает ошибку:

Field 'id' expected a number but got .

611f89dac9daf780727697.png

Если я пытаюсь передать user:

form = BookmarksForm(request.POST, user=request.user.id)


выпадает ошибка:
__init__() got multiple values for argument 'user'
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 1
EgorLee так делать не стоит,
# forms.py
class BookmarksForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(BookmarksForm, self).__init__(*args, **kwargs)
        self.fields['folder'].queryset = Folders.objects.filter(user=user)

# views.py
form = BookmarksForm(request.POST, user=request.user.id)

лучше вам сделать вот так,
# views.py

def bookmarks(request):
    if request.method == 'POST' and 'create_folder' in request.POST:    # форма создания папки
        form = FolderForm(request.POST)
        form.fields['folder'].queryset = Folders.objects.filter(user=request.user)

P.S.
Ну и вот еще, можно что улучшить. Такая структура позволяет избежать дублирования кода
def bookmarks(request):
    if request.method == 'POST':
        folder_form = FolderForm(request.POST)

        if folder_form.is_valid():
            if 'create_folder' in request.POST:
                pass
            if 'create_bm' in request.POST:
                pass

            return redirect('bookmarks')
        else:
            form.add_error(None, 'Ошибка добавления папки')
    else:
        folder_form = FolderForm()

    return render(request, 'mainapp/bookmarks.html', {
        'title': 'закладки',
        'folder_form': folder_form,
        'bm_form': bookmarks_form,
        'folders': folder,
        'fl': fastlink
    })
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы