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

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

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

  1. Сгенерировать html-форму из таблицы db
  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 также приветствуются!

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

1
watr 7 Авг 2010 в 23:13

2 ответа

Лучший ответ

Используйте 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
satoru 8 Авг 2010 в 04:08