Создание пользовательских форм из схемы БД - PullRequest
1 голос
/ 07 августа 2010

Я - текущий пользователь web2py, но обнаруживаю, что время от времени возвращаюсь в Django (с чего я начинал). В частности, при работе над проектами, где я хочу использовать некоторые конкретные приложения / плагины / расширения django, которые еще не существуют в web2py.

Одна вещь, без которой я не могу жить в web2py, для которой я ищу решение в Django, это способ создания html-форм из таблицы db и возможность затем настраивать их внешний вид и макет в представлении. без javascript.

Ключевые вещи, которые я ищу:

  1. Создание HTML-формы из таблицы БД
  2. Назначение пользовательских классов / идентификаторов CSS каждому полю в сгенерированной HTML-форме (js отключено)
  3. Поместите каждое поле / элемент формы в предварительно созданное HTML-представление с помощью вызова метода в представлении

т.е.

У меня есть таблица A. В web2py я могу сделать (в контроллере):

def display_form():
   form = SQLFORM(db.table_A)
   #Can I do the following in Django? Assign custom CSS to each form field?
   form.element(_name='email')['_class'] = = "custom_css_classes, list"

   if form.accepts(request.vars, session):
       response.flash = 'form accepted'
   elif form.errors:
       response.flash = 'form has errors'
   else:
       response.flash = 'please fill out the form'
   return dict(form=form)

Затем в представлении я могу сделать:

form.custom.start
form.custom.widget.name
form.custom.widget.email
form.custom.widget.form_field_name
           ...
<div class="span-5 last"><input type="submit" class="register_btn" value="Sign Up"></input></div>
form.custom.end

Вышеприведенное берет таблицу БД, создает форму HTML, а затем позволяет мне прикрепить каждое отдельное поле формы в любое место в готовом HTML, который я хочу (используя эти «пользовательские» вызовы методов для переданной «формы»). объект. Включая пользовательские классы CSS, которые я назначил каждому отдельному полю сгенерированной HTML-формы.

Подробнее о вышеуказанном коде см. В документации:

http://web2py.com/book/default/chapter/06?search=define_table

http://web2py.com/book/default/chapter/07?search=sqlform#SQLFORM

http://web2py.com/book/default/chapter/05?search=#Server-side-DOM-and-Parsing

http://web2py.com/book/default/chapter/07?search=form.custom

Как мне сделать вышеупомянутое в Django, не пачкая мой javascript хакерами макетов. Предположим, что javascript отключен в браузерах, где мне нужно запустить приложение. Кроме того, я хотел бы использовать админку Django. Также приветствуются решения Pylons!

Ссылки на статьи / учебные пособия / инструкции для этого будут с благодарностью. Также, пожалуйста, сделайте эквивалентный результат из приведенного выше кода, используя метод, который вы упомянули в своем ответе ...

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Используйте ModelForm и переопределите любое поле, которое хотите настроить, явно объявив их.

Если вы хотите установить атрибуты поля, такие как class и id, вам нужно сделать что-то вроде этого:

name = forms.CharField(
                widget=forms.TextInput(attrs={'class':'special'}))

Если вам интересно, вы можете изменить порядок полей, указав последовательность fields в вашем Meta классе:

class Meta:
    model = YourModel
    fields = ('title', 'content')

Вы можете прочитать полную документацию здесь: http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs

1 голос
/ 07 августа 2010

Если вы еще этого не сделали, взгляните на Django's ModelForm .Я предполагаю, что у вас есть модели, сопоставленные с соответствующими таблицами.Экземпляры Vanilla ModelForm будут работать без JS.Однако ModelForm s обычно определяются заранее и не создаются на лету.Я предполагаю, что они могут быть созданы на лету, но это было бы немного сложно.

...