2009-03-20 7 views
4

후속 조치 : How do you change the default widget for all Django date fields in a ModelForm?입니다.Django에서 특정 유형의 모든 내장 양식 필드에 대한 기본 위젯을 어떻게 수정합니까?

통제 범위를 벗어난 다른 개발자의 입력으로 커지면서 매우 많은 수의 모델 (예 : AZZZ)이 있고 모든 날짜 필드가 입력되는 방식을 변경하려는 경우 (예 : jQueryUI). 새로운 위젯을 사용하여 모든 날짜 필드를 채우는 가장 좋은 방법은 무엇입니까? 인용 질문에서

한 가지 제안을했다 : 그러나

def make_custom_datefield(f): 
    if isinstance(f, models.DateField): 
     # return form field with your custom widget here... 
    else: 
     return f.formfield() 

class SomeForm(forms.ModelForm): 
    formfield_callback = make_custom_datefield 

    class Meta: 
     # normal modelform stuff here... 

당신이 명시 ModelForm의의를 가지고 있지 않지만, URL 패턴이 직접 모델을 어디에서 온 수행이 가능하다? 즉, 귀하의 URL 설정이 likeso입니다 :

SomeModelA 백그라운드에서 장고에 의해 ModelForm으로 바뀌 모델 (안 양식) 그입니다입니다
url(r'^A/?$', 'list_detail.object_list', SomeModelA) 

.

현재 내 시스템에는 각 모델에 대한 양식이 없습니다. 양식을 명시 적으로 작성하는 유일한 방법은 이전 솔루션에서 제안 된 formfield_callback을 추가하는 것이지만 DRY 원칙에 위배되므로 오류가 발생하고 노동 집약적입니다.

필자는 (마지막 스레드에서 제안한대로) 특별한 위젯이 있고 내장 된 대신 내 필드를 사용하는 것으로 생각했습니다. 그다지 노동 집약적 인 것은 아니지만 오류가 발생할 수 있습니다 (그래도 좋은 grep으로는 해결할 수 없음).

제안 및 의견을 보내 주시면 감사하겠습니다.

답변

7

프로젝트 전체에서이 작업을 수행하려는 것처럼 보일 수도 있습니다 (즉, 일부 경우이 작업을 시도하지 않고 실행중인 응용 프로그램의 모든 경우).

하나의 가능성은 DateField 클래스 자체의 위젯 속성을 대체하는 것입니다. 중앙 위치에서이 작업을 수행해야합니다 ... django 앱의 모든 실행중인 인스턴스가로드 할 수 있도록 보장되는 항목입니다. 미들웨어가이를 도와 줄 수 있습니다. 그렇지 않으면 앱 파일 __init__에 넣기 만하면됩니다.

원하는 것은 forms.DateField 클래스 자체의 위젯 속성을 다시 지정하는 것입니다. 새로운 DateField가 생성되면 Django는 코드가 필드 속성 정의에서 특정 위젯을 지정하는지 확인합니다. 그렇지 않으면 DateField에 기본값을 사용합니다. 시나리오의 사용자가 특정 위젯을 실제로 정의한 경우 글로벌 API를 변경 했음에도 불구하고이를 존중하고 싶다고 가정합니다.

from django import forms 
forms.DateField.widget = forms.HiddenInput 

class Foo(forms.Form): 
    a = forms.DateField() 

f = Foo() 
print f.fields['a'].widget 
# results in <django.forms.widgets.HiddenInput object at 0x16bd910> 
+0

티켓입니다 :

이 경우 ... 다른 위젯을 기본 강제의 예로서 HiddenInput을이보십시오. 고맙습니다. –

+0

굉장! 정말 고마워! – dfrankow