python django - 장고는 폼 필드 렌더링 순서를 어떻게 알 수 있습니까?




conf urls (13)

필자는 필드 이동에 대해 다음과 같이 사용했습니다.

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에서 작동하고 합리적으로 더 최신 버전에서 여전히 작동하는지 확신합니다.

내가 장고 양식을 가지고 있다면 :

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

그리고이 폼의 인스턴스에 대해 as_table () 메서드를 호출하면 Django는 필드를 위에서 지정한 것과 같은 순서로 렌더링합니다.

내 질문은 장고 클래스 변수가 정의 된 순서를 어떻게 알 수 있습니까?

(또한 classe의 init 메소드에서 필드를 추가하려는 경우와 같이이 순서를 어떻게 오버라이드합니까?)


나는 계속 나아가 내 자신의 질문에 대답했다. 다음 참조 용 답변입니다.

Django에서 form.py__new__ 메소드를 사용하여 클래스 변수를 궁극적으로 클래스에 정의 된 순서대로 self.fields 에로드하는 어두운 마술을 수행합니다. self.fields 는 Django SortedDict 인스턴스입니다 ( datastructures.py 정의되어 있습니다).

그래서 이것을 덮어 쓰려면, 예를 들어 보낸 사람을 먼저 보내고 싶지만 init 메서드에 추가해야한다고 말하면 다음과 같습니다.

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)
        #first argument, index is the position of the field you want it to come before
        self.fields.insert(0,'sender',forms.EmailField(initial=str(time.time())))

필드는 ModelClass._meta.fields에 정의 된 순서대로 나열됩니다. 그러나 Form에서 순서를 변경하려면 keyOrder 함수를 사용하면됩니다. 예 :

class ContestForm(ModelForm):
  class Meta:
    model = Contest
    exclude=('create_date', 'company')

  def __init__(self, *args, **kwargs):
    super(ContestForm, self).__init__(*args, **kwargs)
    self.fields.keyOrder = [
        'name',
        'description',
        'image',
        'video_link',
        'category']

양식 필드에는 creation_counter라는 creation_counter 순서에 대한 속성이 있습니다. .fields 속성은 사전이므로 사전에 간단히 추가하고 모든 필드의 creation_counter 속성을 변경하여 새로운 순서를 반영하면 충분합니다 (그래도 시도하지 않았습니다).


Django 1.7 양식에서는 추가 연산자를 지원하지 않는 OrderedDict를 사용합니다. 그래서 당신은 처음부터 사전을 재구성해야합니다 ...

class ChecklistForm(forms.ModelForm):

  class Meta:
    model = Checklist
    fields = ['name', 'email', 'website']

  def __init__(self, guide, *args, **kwargs):
    self.guide = guide
    super(ChecklistForm, self).__init__(*args, **kwargs)

    new_fields = OrderedDict()
    for tier, tasks in guide.tiers().items():
      questions = [(t['task'], t['question']) for t in tasks if 'question' in t]
      new_fields[tier.lower()] = forms.MultipleChoiceField(
        label=tier,
        widget=forms.CheckboxSelectMultiple(),
        choices=questions,
        help_text='desired set of site features'
      )

    new_fields['name'] = self.fields['name']
    new_fields['email'] = self.fields['email']
    new_fields['website'] = self.fields['website']
    self.fields = new_fields 

Django 1.9는 Form.field_orderForm.order_fields() 합니다.

# example

class SignupForm(forms.Form):

    password = ...
    email = ...
    username = ...

    field_order = ['username', 'email', 'password']

장고 1.9 형식에서 필드를 주문하는 가장 쉬운 방법은 field_order 형식으로 Form.field_order 를 사용하는 field_order 입니다.

여기에 작은 예제가있다.

class ContactForm(forms.Form):
     subject = forms.CharField(max_length=100)
     message = forms.CharField()
     sender = forms.EmailField()
     field_order = ['sender','message','subject']

field_order dict에 지정한 순서대로 모든 항목이 표시됩니다.


[참고 :이 답변은 이제 완전히 구식입니다. 아래의 토론 및 더 최근의 답변을 참조하십시오.

f가 양식 인 경우 해당 필드는 f.fields이며 django.utils.datastructures.SortedDict (항목이 추가 된 순서대로 표시됩니다). 양식 작성 후 f.fields에는 keyOrder 속성이 있습니다.이 속성은 제시해야하는 순서대로 필드 이름을 포함하는 목록입니다. 올바른 주문으로이 항목을 설정할 수 있습니다 (항목을 생략하거나 추가 기능을 추가 할 수 있도록주의해야합니다).

다음은 현재 프로젝트에서 만든 예제입니다.

class PrivEdit(ModelForm):
    def __init__(self, *args, **kw):
        super(ModelForm, self).__init__(*args, **kw)
        self.fields.keyOrder = [
            'super_user',
            'all_districts',
            'multi_district',
            'all_schools',
            'manage_users',
            'direct_login',
            'student_detail',
            'license']
    class Meta:
        model = Privilege

폼 클래스를 정의 할 때 사용되는 메타 클래스와 관련이 있습니다. 내 생각에는 필드의 내부 목록을 유지하고 목록의 중간에 삽입하면 작동 할 수도 있습니다. 그 코드를 살펴본 지 꽤 오래되었습니다.


Django> = 1.7 인 경우 ContactForm.base_fields 를 다음과 같이 수정해야합니다.

from collections import OrderedDict

...

class ContactForm(forms.Form):
    ...

ContactForm.base_fields = OrderedDict(
    (k, ContactForm.base_fields[k])
    for k in ['your', 'field', 'in', 'order']
)

이 트릭은 장고 관리자의 PasswordChangeForm : Source on Github에서 사용됩니다.


내부 Meta 클래스에서 fields 를 사용하는 것은 Django==1.6.5 대해 저에게 Django==1.6.5 이었습니다 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']

저것과 같이 쉬운.


Field 클래스의 카운터를 사용하십시오. 해당 카운터로 정렬 :

import operator
import itertools

class Field(object):
    _counter = itertools.count()
    def __init__(self):
        self.count = Field._counter.next()
        self.name = ''
    def __repr__(self):
        return "Field(%r)" % self.name

class MyForm(object):
    b = Field()
    a = Field()
    c = Field()

    def __init__(self):
        self.fields = []
        for field_name in dir(self):
            field = getattr(self, field_name)
            if isinstance(field, Field):
                field.name = field_name
                self.fields.append(field)
        self.fields.sort(key=operator.attrgetter('count'))

m = MyForm()
print m.fields # in defined order

산출:

[Field('b'), Field('a'), Field('c')]

  1. "장고에 구축 된 가장 큰 사이트는 무엇입니까?"

    Django 사이트에서 트래픽에 대한 정보를 수집하는 단일 장소가 없으므로 다양한 위치의 데이터를 사용하여 사이트를 찌를 것입니다. 먼저 장고 프로젝트 페이지 의 첫 페이지에 장고 사이트 목록이 있고 djangosites.org 에 장고 내장 사이트 목록이 있습니다. 목록을 살펴보고 내가 아는 일부를 선택하면 알만한 트래픽이 발생합니다.

  2. "Django는 하루에 2 만 시간 동안 사이트를 방문하는 사용자 100,000 명을 매일 처리 할 수 ​​있습니까?"

    예, 위를 참조하십시오.

  3. "와 같은 사이트가 장고에서 실행될 수 있습니까?"

    내 직감은 예스지만 다른 사람들이 대답하면서 마이크 말론 (Mike Malone)이 프리젠 테이션에서 언급 한 것처럼 데이터베이스 디자인이 중요합니다. 신뢰할 수있는 트래픽 통계를 찾을 수 있으면 www.cnprog.com에서도 강력한 증거를 찾을 수 있습니다. 어쨌든, 장고 모델을 함께 던지면 일어날 일이 아닙니다. :)

물론 더 많은 사이트와 관심있는 블로거가 있지만 어딘가에서 멈추어야합니다!

Django를 사용하여 트래픽이 많은 사이트 michaelmoore.com을 구축하는 블로그 게시물은 상위 10,000 개의 웹 사이트 로 설명됩니다. Quantcast 통계Compete.com 통계 .

(*) 해당 프로젝트에서 아웃소싱 한 개발자로 일하는 데 사용 된 참조를 포함하여 편집자.







python django django-forms