Найти - Пользователи
Полная версия: Класс форм
Начало » Django » Класс форм
1 2
balalay12
Добрый день!

Не могу инициализировать выпадающий список в форме класса.
Пробовал делать через initial, но на форму это никак не повлияло, а через __init__ выдает ошибку:
list indices must be integers, not str
Код:
class AddCost(CreateView):
    category_list = Category.objects.filter(operation_type=1)
    categorys = [(i.id, i.name) for i in category_list]
    model = Many
    fields = ['date', 'sum', 'comment', 'category']
    # initial = {'category':categorys}
    def __init__(self, *args, **kwargs):
        category_list = Category.objects.filter(operation_type=2)
        categorys = [int((i.id)) for i in category_list]
        super(AddCost, self).__init__(*args, **kwargs)
        self.fields['category'].initial = categorys
    def form_valid(self, form):
        data = form.save(commit=False)
        if data.sum > 0:
            data.sum *= -1
        instance = form.save(commit=True)
        instance.users.add(self.request.user.id)
        return super(AddCost, self).form_valid(form)

И еще вопрос. Как можно передать username на страницу с формой из этого класса?
FishHook
1. Покажите форму.
2. Что именно вы хотите инициализировать: набор элементов для выбора или выбранный изначально элемент в соответствии с записью в БД? ?
balalay12
1. Форма генерится автоматом т.к. наследую CreateView и UpdateView, то есть код который выше у меня находится в файле view. Или я чего-то не понял.
2.1 При создании мне нужен набор элементов для выбора, но этот набор должен быть выборкой из БД. При обновлении UpdateView сам подставляет выбранный элемент. но и там мне тоже надо опр. набор как и при создании.
FishHook
balalay12
Форма генерится автоматом т.к. наследую CreateView и UpdateView, то есть код который выше у меня находится в файле view. Или я чего-то не понял.
Форма может не делаться автоматом, для этого есть параметр form_class и метод get_form_class.

Я бы сделал форму руками. У неё определил __init__ как то так
class MyFom(ModelForm):
    
    def __init__(self, **kwargs):
        queryset = kwrgs.pop("queryset")
        super(MyFom, self).__init__(**kwargs)
        self.fields["myfield"].queryset = queryset
во вьюхе переопределил бы get_form_kwargs для вставки queryset.

Подход какой-то такой, код не обязательно заработает, сейчас не на чем проверить. Экспериментируйте.
balalay12
Форму создал. Все отображает как надо.
Но теперь не сохраняет и не выводит ошибки. Мои мысли по этому поводу такие, что после того как создал форму form_save уже не срабатывает и нужно писать функцию сохранения в форме?
FishHook
balalay12
form_save уже не срабатывает и нужно писать функцию сохранения в форме?
Все должно работать, показывайте код.
balalay12
forms.py
class AddErnForm(forms.ModelForm):
    class Meta:
        model = Many
        fields = ['date', 'sum', 'comment', 'category']
    def __init__(self, **kwargs):
        queryset = kwargs.pop("queryset")
        super(AddErnForm, self).__init__(**kwargs)
        self.fields['category'].queryset = queryset

views.py
class AddErn(CreateView):
    model = Many
    form_class = forms.AddErnForm
    def get_form_kwargs(self):
        category_list = Category.objects.filter(operation_type=1)
        kwargs = {'queryset':category_list}
        return kwargs
    def form_valid(self, form):
        instance = form.save()
        instance.users.add(self.request.user.id)
        return super(AddErn, self).form_valid(form)
FishHook
    def get_form_kwargs(self):
        category_list = Category.objects.filter(operation_type=1)
        kwargs = {'queryset':category_list}
        return kwargs
А супер кто будет вызывать?
balalay12
Спасибо. Сделал. Все работает. Просто до этого смотрел пример как делать и там не было строчки с super.
balalay12
А можно через kwars инициализировать переменные в шаблоне с формой? Допустим так же передать username или чтобы менюшка была разной при использовании одного шаблона.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB