Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 21, 2013 16:17:39

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

Приветствую.
Есть несколько вопросов относительно форм.

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?



Отредактировано soln (Дек. 21, 2013 16:44:47)

Офлайн

#2 Дек. 21, 2013 16:47:55

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

Вопросы новичка о формах.

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



Офлайн

#3 Дек. 21, 2013 17:55:24

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

FishHook
Если бы Вы сказали сначала чего Вы хотите,
Я хочу составить форму на основе некоторого списка про который мне известно лишь что это список строк.

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

Честно говоря не понял к чему эти теги и к каким формам они относятся?
ps
FishHook
когда осмыслите происходящее
Когда это случится единственное зачем я могу вернутся это сказать спасибо.
А пока увы.



Офлайн

#4 Дек. 21, 2013 18:20:41

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

Вопросы новичка о формах.

soln
Честно говоря не понял к чему эти теги и к каким формам они относятся
Ок, что по Вашему делает {{ form }} в шаблоне?
Вы утверждаете, что осили доку, ну тогда Вы должны знать как кастомно
то есть на свой вкус отобразить содержимое формы в шаблоне. Не думаете же Вы, что кроме стандартных
{{ form.as_table }} и {{ form.as_ul }} нет других способов?



Офлайн

#5 Дек. 21, 2013 19:01:57

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

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>







Отредактировано soln (Дек. 21, 2013 19:02:28)

Офлайн

#6 Дек. 21, 2013 19:23:45

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

Вопросы новичка о формах.

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




Офлайн

#7 Дек. 21, 2013 20:23:08

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

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

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

Я извиняюсь но я побегу посмотрю сюда только утром.



Офлайн

#8 Дек. 22, 2013 11:01:48

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

 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 можно получить любые данные. Хотя это все равно это не то что вы хотите

Отредактировано Singularity (Дек. 22, 2013 11:20:45)

Офлайн

#9 Дек. 23, 2013 17:53:00

soln
От:
Зарегистрирован: 2011-11-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы новичка о формах.

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

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”



Офлайн

#10 Дек. 24, 2013 05:04:20

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

Вопросы новичка о формах.

Как передать связанные данные в шаблон чтерез форму?
 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 %}



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version