Список пропусков Django для создания вариантов выбора

Я хочу создать ChoiceField в форме, в которой есть варианты из списка, переданного ему представлением.

from django import forms

class OrderForm(forms.Form):
    product_choices = []

    def __init__(self, products=None, *args, **kwargs):
        super(OrderForm, self).__init__(*args, **kwargs)
        if products:
            print(products)
            choices = enumerate(products)

    product_name = forms.ChoiceField(label='Product', choices=choices)

Не знаете, как использовать функцию инициализации для достижения этой цели?


person Davtho1983    schedule 06.11.2018    source источник


Ответы (1)


Вышеприведенное не будет работать, так как choices, который вы здесь определяете, будет взят из переменной с именем choices при построении класса.

Однако вы можете сгенерировать:

from django import forms

class OrderForm(forms.Form):
    
    product_name = forms.ChoiceField(label='Product', choices=[])

    def __init__(self, products=None, *args, **kwargs):
        super(OrderForm, self).__init__(*args, **kwargs)
        if products:
            self.fields['product_name'].choices = [
                (str(k), v)
                for k, v in enumerate(products))
            ]

Таким образом, вы затем создаете OrderForm и передаете список (или любую итерацию строк) через параметр products, например:

def some_view(request):
    form = OrderForm(products=['product A', 'product B'])
    # ...
    # return some HttpResponse
person Willem Van Onsem    schedule 06.11.2018
comment
Эта форма не возвращает никаких значений? Ошибка проверки, поскольку поле возвращает None - person Davtho1983; 07.11.2018
comment
@ Davtho1983: Form не возвращает значения. После .is_valid() у него будет словарь cleaned_data, содержащий данные, вы также должны передать request.POST в качестве параметра данных в форму. - person Willem Van Onsem; 07.11.2018
comment
Да, это ошибка, которую я получаю - объект не имеет атрибута 'cleaned_data' - person Davtho1983; 07.11.2018
comment
Ну тогда ваша форма просто недействительна, значит вы ввели неверные данные, либо вы не передали request.POST в форму. Форма без переданных данных считается недействительной. - person Willem Van Onsem; 07.11.2018
comment
Это потому, что я создаю варианты выбора как целые индексы, используя enumerate, когда ChoiceField ожидает возврата строки? - person Davtho1983; 07.11.2018
comment
@ Davtho1983: ах да, это возможно. Вы снова передаете productss, когда создаете OrderForm с данными request.POST? - person Willem Van Onsem; 07.11.2018
comment
Я делаю form = OrderForm(request.POST или None, product_titles), прежде чем проверять, является ли запрос POST, и сбрасываю форму с помощью form = OrderForm(product_titles), если запрос не POST? - person Davtho1983; 07.11.2018
comment
@ Davtho1983: используйте именованные аргументы OrderForm(data=request.POST, products=product_titles). - person Willem Van Onsem; 07.11.2018
comment
Давайте продолжим обсуждение в чате. - person Davtho1983; 07.11.2018
comment
это работает для меня. Кроме того, я действительно хотел бы, чтобы этот ответ был немного более популярным, потому что из всех моих поисков на SO этот кажется самым простым в передаче аргументов в форму через представления. - person Gene Burinsky; 01.08.2020