Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 30, 2014 07:18:11

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

Добрый день!

Не могу инициализировать выпадающий список в форме класса.
Пробовал делать через 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 на страницу с формой из этого класса?

Офлайн

#2 Сен. 30, 2014 08:09:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Класс форм

1. Покажите форму.
2. Что именно вы хотите инициализировать: набор элементов для выбора или выбранный изначально элемент в соответствии с записью в БД? ?



Офлайн

#3 Сен. 30, 2014 08:18:05

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

1. Форма генерится автоматом т.к. наследую CreateView и UpdateView, то есть код который выше у меня находится в файле view. Или я чего-то не понял.
2.1 При создании мне нужен набор элементов для выбора, но этот набор должен быть выборкой из БД. При обновлении UpdateView сам подставляет выбранный элемент. но и там мне тоже надо опр. набор как и при создании.

Отредактировано balalay12 (Сен. 30, 2014 08:19:23)

Офлайн

#4 Сен. 30, 2014 10:57:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Класс форм

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.

Подход какой-то такой, код не обязательно заработает, сейчас не на чем проверить. Экспериментируйте.



Офлайн

#5 Сен. 30, 2014 12:39:29

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

Форму создал. Все отображает как надо.
Но теперь не сохраняет и не выводит ошибки. Мои мысли по этому поводу такие, что после того как создал форму form_save уже не срабатывает и нужно писать функцию сохранения в форме?

Отредактировано balalay12 (Сен. 30, 2014 12:42:09)

Офлайн

#6 Сен. 30, 2014 15:25:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Класс форм

balalay12
form_save уже не срабатывает и нужно писать функцию сохранения в форме?
Все должно работать, показывайте код.



Офлайн

#7 Сен. 30, 2014 17:10:31

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

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)

Офлайн

#8 Сен. 30, 2014 17:35:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Класс форм

    def get_form_kwargs(self):
        category_list = Category.objects.filter(operation_type=1)
        kwargs = {'queryset':category_list}
        return kwargs
А супер кто будет вызывать?



Офлайн

#9 Сен. 30, 2014 20:16:14

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

Спасибо. Сделал. Все работает. Просто до этого смотрел пример как делать и там не было строчки с super.

Офлайн

#10 Окт. 1, 2014 07:13:40

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

Класс форм

А можно через kwars инициализировать переменные в шаблоне с формой? Допустим так же передать username или чтобы менюшка была разной при использовании одного шаблона.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version