Джанго формы, наследование и порядок полей формы - PullRequest
62 голосов
/ 27 мая 2009

Я использую формы Django на своем веб-сайте и хотел бы контролировать порядок полей.

Вот как я определяю свои формы:

class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class create_form(edit_form):
    name = forms.CharField()

Имя является неизменным и должно быть указано только при создании объекта. Я использую наследование, чтобы добавить последовательность и принципы СУХОЙ. То, что происходит, что не является ошибочным, на самом деле вполне ожидаемым, это то, что поле имени указано последним в view / html, но я бы хотел, чтобы поле имени было в верхней части сводки и описания. Я понимаю, что могу легко это исправить, скопировав сводку и описание в create_form и потеряв наследство, но я хотел бы знать, возможно ли это.

Почему? Представьте, что у вас есть 100 полей в edit_form и вам нужно добавить 10 полей сверху в create_form - копирование и поддержание двух форм не будет выглядеть так привлекательно. (Это не мой случай, я просто делаю пример)

Итак, как мне переопределить это поведение?

Edit:

Видимо, нет правильного способа сделать это, не пройдя через неприятные хаки (возиться с атрибутом .field). Атрибут .field - это SortedDict (одна из внутренних структур данных Django), который не предоставляет никакого способа переупорядочить пары ключ: значение. Тем не менее, он обеспечивает способ вставки элементов по заданному индексу, но это переместит элементы из членов класса в конструктор. Этот метод будет работать, но сделает код менее читабельным. Единственный другой способ, который я считаю нужным, - это изменить саму платформу, которая в большинстве случаев является неоптимальной.

Короче говоря, код станет примерно таким:

class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class create_form(edit_form):
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)

        self.fields.insert(0,'name',forms.CharField())

Это меня заткнуло :)

Ответы [ 11 ]

0 голосов
/ 09 октября 2015

Я создал форму 'ExRegistrationForm', унаследованную от 'RegistrationForm' от Django-Registration-Redux. Я столкнулся с двумя проблемами, одна из которых заключалась в изменении порядка полей на странице вывода html после создания новой формы.

Я решил их следующим образом:

1. ВОПРОС 1: Удалить имя пользователя из регистрационной формы: в my_app.forms.py

    class ExRegistrationForm(RegistrationForm):
          #Below 2 lines extend the RegistrationForm with 2 new fields firstname & lastname
          first_name = forms.CharField(label=(u'First Name'))
          last_name = forms.CharField(label=(u'Last Name'))

          #Below 3 lines removes the username from the fields shown in the output of the this form
          def __init__(self, *args, **kwargs):
          super(ExRegistrationForm, self).__init__(*args, **kwargs)
          self.fields.pop('username')

2. ВОПРОС 2: Сделать имя и фамилию сверху: в шаблонах / registration / registration_form.html

Вы можете индивидуально отображать поля в нужном вам порядке. Это может помочь в случае, если количество полей меньше, но нет, если у вас есть большое количество полей, в которых практически невозможно фактически записать их в форму.

     {% extends "base.html" %}
     {% load i18n %}

     {% block content %}
     <form method="post" action=".">
          {% csrf_token %}

          #The Default html is: {{ form.as_p }} , which can be broken down into individual elements as below for re-ordering.
          <p>First Name: {{ form.first_name }}</p>
          <p>Last Name:  {{ form.last_name }}</p>
          <p>Email: {{ form.email }}</p>
          <p>Password: {{ form.password1 }}</p>
          <p>Confirm Password: {{ form.password2 }}</p>

          <input type="submit" value="{% trans 'Submit' %}" />
      </form>
      {% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...