LINUX.ORG.RU

где повлиять на QuerySet поля из CBV

 


0

1

В некоторой модели имеется ForeignKey поле. Для этой модели создается представление на базе CreateView, позволяющее сделать запись. Какой метод класс CreateView нужно переопределить, что ограничить список значений для конкретного поля.

Ну например,

class Author(models.Model):
    name =  models.ForeignKey(User)

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

мне нужно, чтобы пользователь выбирал не из всех пользователей, к-е есть в БД, а только из пользователей, например, логин которых начинается на 'b': т.е. пользователей из списка

User.objects.filter(username='b').

Ответ на: комментарий от anonymous

в документации методом get_querset или еще проще полем queryset меняется контент для классов наследников ListView. Мне же нужно изменить выборку для поля.

django2014
() автор топика

в принципе пробовал так:

class AuthorForm(forms.ModelForm):
    class Meta:
       model = Author
       fields = ['name']
    def __init__(self, *args, **kwargs):
       super(AuthorForm, self).__init__(*args, **kwargs)
       self.fields['name'].queryset = User.objects.filter(username='bob')

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']
    form = AuthorForm

при этом выбираются все пользователи, в том числе и 'bob'.

django2014
() автор топика
Ответ на: комментарий от django2014
>>> models.User.objects.all()
[<User: admin>, <User: user>]
>>> models.Notes.objects.filter(owner__username='admin')
[<Notes: test2>, <Notes: test>, <Notes: test3>]
>>> models.Notes.objects.filter(owner__username='user')
[<Notes: test222>, <Notes: test>, <Notes: 123>, <Notes: 1>, <Notes: testt1>, <Notes: 1>, <Notes: 2>, <Notes: 5>, <Notes: 6>, <Notes: 5>, <Notes: 1>, <Notes: 12>, <Notes: 1>, <Notes: 00>, <Notes: 12>, <Notes: 1>, <Notes: 1>, <Notes: 00>, <Notes: 12>, <Notes: 1>, '...(remaining elements truncated)...']

Notes.owner = models.ForeignKey(User)

exception13 ★★★★★
()
Ответ на: комментарий от anon1984

anon1984 спасибо за ModelChoiceField.

Что не так сделал? Из списка выпадают все user-ы из базы, как при User.objects.all(). Есть подозрения что где-то этот список всетаки переопределяется в CreateView.

class Author(models.Model):
    name =  models.ForeignKey(User)

class AuthorForm(forms.ModelForm):
    class Meta:
       model = Author
       name = ModelChoiceField(      queryset=User.objects.filter(username='bob')  )

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']
    form = AuthorForm

django2014
() автор топика
Ответ на: комментарий от django2014

проблема решена.

нужно использовать form_class

django2014
() автор топика
Ответ на: комментарий от django2014
class Author(models.Model):
    name =  models.ForeignKey(User)

class AuthorForm(forms.ModelForm):
    class Meta:
       model = Author
       name = ModelChoiceField(      queryset=User.objects.filter(username='bob')  )

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']
    #!!очепятка - должно быть: form_class = AuthorForm
    form = AuthorForm

ну и fields во view не действует, раз уж указали класс формы

anon1984
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.