Как Django знает порядок отображения полей формы? - PullRequest
84 голосов
/ 08 декабря 2008

Если у меня есть форма Django, такая как:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()

И я вызываю метод as_table () экземпляра этой формы, Django отобразит поля в том же порядке, как указано выше.

Мой вопрос: как Django узнает, в каком порядке определены переменные класса?

(Также как мне переопределить этот порядок, например, когда я хочу добавить поле из метода init класса?)

Ответы [ 14 ]

2 голосов
/ 05 декабря 2014

Если либо fields = '__all__':

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = '__all__'

или exclude используются:

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

Затем Django ссылается на порядок полей , как определено в модели . Это просто застало меня врасплох, поэтому я решил упомянуть об этом. На него ссылаются в ModelForm документах :

Если любой из них используется, порядок отображения полей в форме будет соответствовать порядку, заданному полями в модели, при этом экземпляры ManyToManyField будут отображаться последними.

1 голос
/ 22 августа 2014

Использование fields во внутреннем Meta классе - это то, что работало для меня на Django==1.6.5:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Example form declaration with custom field order.
"""

from django import forms

from app.models import AppModel


class ExampleModelForm(forms.ModelForm):
    """
    An example model form for ``AppModel``.
    """
    field1 = forms.CharField()
    field2 = forms.CharField()

    class Meta:
        model = AppModel
        fields = ['field2', 'field1']

Так просто.

0 голосов
/ 05 декабря 2014

Я использовал это для перемещения полей:

def move_field_before(frm, field_name, before_name):
    fld = frm.fields.pop(field_name)
    pos = frm.fields.keys().index(before_name)
    frm.fields.insert(pos, field_name, fld)

Это работает в версии 1.5, и я уверен, что оно работает в более поздних версиях.

0 голосов
/ 08 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...