Найти - Пользователи
Полная версия: Django form ChoiceField. Как правильно сформировать список туплов?
Начало » Django » Django form ChoiceField. Как правильно сформировать список туплов?
1
gtlhbkkj
Генерирую список из двух туплов для передачи в ChoiceField в моей форме.
Первый тупл это primary key (то бишь номер записи), второй - сгенерированный текст

 views.py
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect
from .models import *
def n01_size_kss(request):
    if request.method == 'POST':
        form = KSS_Form(request.POST)
        context = {'form':form}
        if form.is_valid():
            filtertype, context = n01_context_cleaned_data(form.cleaned_data)
            if filtertype != "none":
                geh_innen_choice = prepare_dictionary_form2(context)
                form1.fields['geh_innen'].choices = geh_innen_choice
                context = {'form':form1, **context}
            return render(request, 'af/size/01_kss_size2.html', context)
    else:
        context = {'form':KSS_Form()}
        return render(request, 'af/size/01_kss_size1.html', context)
def prepare_dict_form_n01_01(context):    
    baureihe_record1  = context['baureihe_record1']
    filter_label = baureihe_record1.series.valuefg
    x_choice = afc_select_housing_innenteile.objects.filter(Q(series__valuefg__exact=filter_label)).order_by('price')
    geh_innen_choice = []
    for i in x_choice:
        x = "Housing: " + i.mat_housing.descr
        x1 = (i.id, x)
        geh_innen_choice.append(x1)
    return geh_innen_choice


 forms.py
from django import forms
from django.conf.urls.i18n import i18n_patterns
class KSS_Form1(forms.Form):
    geh_innen = forms.ChoiceField(\
            required=True, \
            label=_("Specify material of the housing:"), \
            disabled=False, \
            )

В результате получаю ошибку
 form.is_valid=FALSE
и когда распечатываю
 form.errors
ошибка выглядит следующим образом
 Select a valid choice. 119 is not one of the available choices
где 119 - это номер записи или primary key

Вот таким образом выглядит ХТМЛ код этого ChoiceField
 <select name="mat_geh_innen" id="id_mat_geh_innen">
  <option value="102">Housing: nodular cast iron || Internals: carbon steel || Element: coil type (Al/1.4571) </option>
  <option value="103">Housing: nodular cast iron || Internals: carbon steel || Element: welded type (1.4571)</option>
  <option value="107">Housing: nodular cast iron || Internals: stainless steel || Element: coil type (Al/1.4571)</option>
  <option value="104">Housing: nodular cast iron || Internals: carbon steel || Element: coil type (1.4571)</option>
  <option value="108">Housing: nodular cast iron || Internals: stainless steel || Element: welded type (1.4571)</option>
  <option value="109">Housing: nodular cast iron || Internals: stainless steel || Element: coil type (1.4571)</option>
  <option value="112">Housing: Stainless steel cast design || Internals: carbon steel || Element: coil type (Al/1.4571)</option>
  <option value="113">Housing: Stainless steel cast design || Internals: carbon steel || Element: welded type (1.4571)</option>
  <option value="117">Housing: Stainless steel cast design || Internals: stainless steel || Element: coil type (Al/1.4571)</option>
  <option value="114">Housing: Stainless steel cast design || Internals: carbon steel || Element: coil type (1.4571)</option>
  <option value="118">Housing: Stainless steel cast design || Internals: stainless steel || Element: welded type (1.4571)</option>
  <option value="119">Housing: Stainless steel cast design || Internals: stainless steel || Element: coil type (1.4571)</option>
</select>
```
FishHook
gtlhbkkj
Вы делаете какую-то лютую дичь. И мне кажется это связано с фундаментальным непониманием питона. В предыдущий раз вы пытались инициализировать состояние объекта не используя ссылку на объект, а изменяя члены класса. Теперь вы зачем то разделили класс формы на какие-то дурацкие функции. Если у вас есть класс и вам нужно специализировать объект этого класса, например, задать какие-то атрибуты полям формы, то это делается в методе __init__. Зачем вы городите какие-то хреновины сбоку?

 #forms.py
class MyForm(forms.Form):
        field_1=forms.CharField)
        def __init__(self, *args, **kwargs):
              super(MyForm, self).__init__(*args, **kwargs)
              self.fields['field_1'].choices = [....your code here....]

gtlhbkkj
FishHook
gtlhbkkjВы делаете какую-то лютую дичь. И мне кажется это связано с фундаментальным непониманием питона. В предыдущий раз вы пытались инициализировать состояние объекта не используя ссылку на объект, а изменяя члены класса. Теперь вы зачем то разделили класс формы на какие-то дурацкие функции. Если у вас есть класс и вам нужно специализировать объект этого класса, например, задать какие-то атрибуты полям формы, то это делается в методе __init__. Зачем вы городите какие-то хреновины сбоку?
Благодарю за помощь.
Вы правы безусловно на 100%.
где бы почитать то, на что вы ссылаетесь?
FishHook
gtlhbkkj
где бы почитать то, на что вы ссылаетесь?
Я ссылаюсь на язык программирования, которому посвящен весь этот ресурс.
Есть даже специальная пркрепленная тема http://python.su/forum/topic/18/
Мой вам совет - изучайте язык, ничего хорошего у вас не получится в джанге, пока вы твердо не освоите основу - язык программирования на котором основан фреймворк.
gtlhbkkj
FishHook
благодарю вас
gtlhbkkj
FishHook
gtlhbkkjВы делаете какую-то лютую дичь.
 #forms.py
class MyForm(forms.Form):
        field_1=forms.CharField)
        def __init__(self, *args, **kwargs):
              super(MyForm, self).__init__(*args, **kwargs)
              self.fields['field_1'].choices = [....your code here....]

как в эту часть
 [....your code here....]
передать переменную из вьюхи чтоб код функционировал?
FishHook
gtlhbkkj
передать переменную из вьюхи чтоб код функционировал?
Ну вы же где-то создаете объект этого класса.
Вы знаете, как в питоне создать объект и передать параметры в функцию инициализации?
gtlhbkkj
FishHook
Ну вы же где-то создаете объект этого класса.
Вы знаете, как в питоне создать объект и передать параметры в функцию инициализации?
Честно говоря до сегодняшнего дня в моем лексиконе не было терминов “создать обьект” и “функция инициализации” )). Спасибо, теперь я слегка начинаю понимать что я делаю.

Получился вот такой рабочий код. Всё работает. Нормально так или тоже плохо?

 #views.py
     ...
     x = "ABCDE"
     form1 = KSS_Form1(initial={'x':x})
     context = {'form':form1, **context}
     return render(request, 'af/size/01_kss_size2.html', context)

 #forms.py
class KSS_Form1(forms.Form):
    mat_geh_innen = forms.ChoiceField(choices=[], widget=forms.Select())
    
    def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         x = self.initial['x']
         self.fields['mat_geh_innen'].choices = [
             (i.id, 'Housing: ' + i.mat_housing.descr)
             for i in 
             afc_select_housing_innenteile.objects.filter(series__valuefg=x, anw_01=True)
         ]

своим названием мне больше понравилась эта функция get_initial_for_field(). Я ее крутил-вертел, но постичь и применить не смог. В частности не понял что означают Form.get_initial_for_field(field, field_name) аргументы field, field_name и чем они друг от друга отличаются. Дайте профессиональную наводку пожста.
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