Найти - Пользователи
Полная версия: Вопросы новичка о формах.
Начало » Django » Вопросы новичка о формах.
1
soln
Приветствую.
Есть несколько вопросов относительно форм.

1. Как составить форму на основе динамических данных?
К примеру у нас есть некая api которая выводит список говорящих по телефону сотрудников call center.
[ 'Вася',  'Лена', 'Петя']
При этом понятно что каждый раз обращаясь к API мы будем получать разные данные.

Решил эту задачу посмотрев чуть в исходники, через одно странное место.

class User(forms.Form):
    def __init__(self):
       forms.Form.__init__(self)
       persons = CallcenrAPI()
       # person = [ 'Вася',  'Лена', 'Петя']
        for person in persons:
            self.fields.update({'busy' + person: forms.BooleanField()})
А как правильно?

2. Как передать форму дополнительные данные.
Допустим описанная выше API возвращает следующие данные
    [ ('Вася', 12), ( 'Лена', 23), ('Петя', 63)]
Как передать числа шаблону, чтобы использовать к примеру их качестве значения тега title?
<p title="12"> Вася </p>

3. Возможно ли как то переопределить названия полей в html в случае методов .as_(p|ul|table)?

from django import forms
class User(forms.Form):
    Nekoe_moe_imy_person_one = forms.BooleanField()
    Nekoe_moe_imy_person_two = forms.BooleanField()
    Nekoe_moe_imy_person_fhree = forms.BooleanField()
In [7]: c = User(auto_id=False)
In [8]: c.as_table()

<tr><th>Nekoe moe imy person one:</th><td><input type="checkbox" name="Nekoe_moe_imy_person_one" /></td></tr>\n<tr><th>Nekoe moe imy person two:</th><td><input type="checkbox" name="Nekoe_moe_imy_person_two" /></td></tr>\n<tr><th>Nekoe moe imy person fhree:</th><td><input type="checkbox" name="Nekoe_moe_imy_person_fhree" /></td></tr>

Имена ссылок явно не подходят для представления полей форм. Да и вообще это внутренняя структура зачем ее наружу вытаскивать.
Возможно ли передовать некий alias для представления формы в html посредствам готовых методов as_p, as_ul, as_table?

FishHook
А как правильно?
В чем смысл Ваших действий в class User(forms.Form) я не осилил.
Если бы Вы сказали сначала чего Вы хотите, тогда можно было оценить Ваше решение с точки зрения рациональности. Пока видится бредом.
Как передать числа шаблону, чтобы использовать к примеру их качестве значения тега title?
Тут я перестал Вас понимать окончательно.
Почитайте доку джанги по формам и сделайте для начала все в шаблонах вручную. Именно вручную -
как то так, когда осмыслите происходящее - велком.
{{ form.one_field }}
{{ field.one_field.label_tag }}
{{ form.two_field }}
Выложите сюда.
soln
FishHook
Если бы Вы сказали сначала чего Вы хотите,
Я хочу составить форму на основе некоторого списка про который мне известно лишь что это список строк.

FishHook
Почитайте доку джанги по формам и сделайте для начала все в шаблонах вручную.
Я безусловно ее прочел. Хм ну давайте я пройду и прочту ее еще раз.
Вручную? Ну так я вроде написал в 3 вопросе.
Относительно
FishHook
{{ form.one_field }} {{ field.one_field.label_tag }} {{ form.two_field }}

Честно говоря не понял к чему эти теги и к каким формам они относятся?
ps
FishHook
когда осмыслите происходящее
Когда это случится единственное зачем я могу вернутся это сказать спасибо.
А пока увы.
FishHook
soln
Честно говоря не понял к чему эти теги и к каким формам они относятся
Ок, что по Вашему делает {{ form }} в шаблоне?
Вы утверждаете, что осили доку, ну тогда Вы должны знать как кастомно
то есть на свой вкус отобразить содержимое формы в шаблоне. Не думаете же Вы, что кроме стандартных
{{ form.as_table }} и {{ form.as_ul }} нет других способов?
soln
FishHook
Ок, что по Вашему делает {{ form }} в шаблоне?
Вызовет form.__unicode__()
Каторый
 def __unicode__(self):
     return self.as_table()
 
Каторый в свою очередь вызовет _html_output
FishHook
Вы должны знать как кастомно
то есть на свой вкус отобразить содержимое формы в шаблоне. Не думаете же Вы, что кроме стандартных
{{ form.as_table }} и {{ form.as_ul }} нет других способов?
Они есть Но,

Я не нашел как в нутрь иницилизировоного поля положить доп переменую. Чтоб положить туда даные о поле.
Пример.

 {% for person in persons %}
      <p title={{person.my_var}}> {{ person }} </p>
 {% endfor %}
 
В html это должно выглядеть следующим образом
<tr><p title='Директор' >Василий:</p><td><input type="checkbox" name="Nekoe_moe_imy_person_one" /></td></tr>





FishHook
Давай сначала, чтобы ты понял и я понял,
мы начнем с самого начала.
и так задача,
она абстрагирована ото всего,
формулируй.


soln
Давай попробуем. И да спасибо за терпение.

Задача
Построить форму с checkbox , при наведения курсора мыши на имя поля должна всплывать подсказка.
Для примера возьмём имена сотрудников а подсказкой должна быть зарплата.
Список сотрудников и зарплату мы будем получать из некого 3го места. Важно тут понимать что данные полученные сегодня могут отличатся от вчерашних, единственное на что мы можем рассчитывать что данные будут поступать парно имя и зарплата.

Я извиняюсь но я побегу посмотрю сюда только утром.
Singularity
 filed = forms.ModelMultipleChoiceField(queryset=Model.objects.all(), widget=forms.CheckboxSelectMultiple)
Примерно то что вы хотите сделанное стандартными средствами

А вот немножко лучше
class MyModelChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id
class MyForm(ModelForm):
    filed = MyModelChoiceField(queryset=Model.objects.all(),  widget=forms.CheckboxSelectMultiple)
получаем такое

вместо ID можно получить любые данные. Хотя это все равно это не то что вы хотите
soln
Всем спасибо. В общем кажется нашел ответы на свои вопросы.
И осталю их тут навсякий случай.

1. Как сформировать динамическую форму.
Ну исходя из:
пыщь раз
пыщь два
пыщь три
Делаю вывод, что описанный мной выше способ валиден.
По крайней мере не один я делаю это, через странное место.
В качестве альтернативы этому способу можно использовать метоклассы, или фабрику классов
Но их не надо использовать если не уверен на все 100% что именно оно тебе и надо.
И вообще.
Singularity
Простое лучше, чем сложное.
.

2. Как передать связанные данные в шаблон чтерез форму?
Заглянув в django/forms/fields.py
Обнаружил там следующее в строке 72
Singularity
# help_text – An optional string to use as “help text” for this Field.
Ура, беру!!!
In [56]: class Test(forms.Form):iptv_device_none = forms.BooleanField(help_text='45')
In [57]: test = Test()
In [58]: for field in test:
   ....:     print field
   ....:     print field.help_text
   ....:     
<input type="checkbox" name="iptv_device_none" id="id_iptv_device_none" />
45

3. Возможно ли как то переопределить названия полей в html в случае методов .as_(p|ul|table)?
(Возможно ли объявить некий (alias|as) для представления form.label в html?)
Судя по всему нет. И если я все правильно понял (as_p, as_ul, as_table) это скорее теги для отладки нежели чем для продакшена (мм а как это по русски? ).
Я прав?

И перефразируя известную шутку про freeBSD.
“ Django прекрасно от документирована, язык документации python”
FishHook
Как передать связанные данные в шаблон чтерез форму?
 widgets = {"my_field": forms.widgets.NumberInput(attrs={"tag": "Lalala", "title": "Chuchuchu", "foo": "bar"})}
3. Возможно ли …
А какой смысл в переназываниии полей? Если вам не нравятся стандартные as_p, as_ul, as_table у Вас есть как минимум два пути, 1) Определить свой метод as_nishtyak по аналогии 2) Написать шаблон, рендерящий форму. Вам никто не мешает добавить к полям любые атрибуты
self.fields["my_field"].my_attr = MySuperClass()
{% for field in form %}
   <div style="float: left; width: 200px">
        {{ field.label_tag }}
   </div>
   <div>
        {{ field }}
   </div>
   <div>
        {{ field.field.my_attr.foo }}
   </div>
   <br>
{% endfor %}
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