2009-02-09 4 views
17

다른 필드를 기반으로 관리 양식 필드를 미리 채울 수 있다는 것을 알고 있습니다. 예를 들어 제목 필드를 기반으로 자동으로 채워지는 슬러그 필드가 있습니다.Django - admin 양식 필드를 미리 채우는 방법

그러나 날짜를 기반으로하는 다른 자동 사전 채우기도 만들고 싶습니다. 예를 들어, URL 필드가 있고 자동으로 http://example.com/20090209.mp3 (20090209는 YYYYMMDD)으로 설정됩니다.

"Hello my name is author"와 같이 자동으로 시작하는 텍스트 필드를 만들고 싶습니다. author는 현재 사용자의 이름입니다. 물론 나는 그 사람이 현장을 편집 할 수 있기를 바랍니다. 요점은 사용자가 완전히 자동으로 필드를 갖지 않고 관리자 양식을보다 쉽게 ​​작성할 수 있도록하기위한 것입니다.

답변

2

슬러그 처리는 자바 스크립트로 처리됩니다.

그래서 관리자의 템플릿을 override해야하고 다음 javascript 필드를 채 웁니다. 날짜 문제는 사소한 것이어야하지만, 스크립트에 로그인 한 사용자 이름을 어떻게 가져야하는지 잘 모릅니다. (매우 어렵다고 생각하지는 않았지만 당신은 표류를 얻습니다. :)

2

또한 자동으로 "안녕 내 이름은 저자이다"와 같은 뭔가로 시작하는 텍스트 필드 을하고 싶습니다.

체크 아웃시에 워드 프로세서 : http://docs.djangoproject.com/en/dev/ref/models/fields/#default

당신은 당신의 모델의 CharField() 또는 텍스트 필드()를 가지고 있고, 기본 텍스트를 설정합니다이 옵션을 설정할 수 있습니다. 'default'는 호출 가능한 함수가 될 수도 있습니다. 당신은 당신의 선택의 양식 필드로 교체하여 기본 장고 관리자 필드를 대체 할 수 있습니다

+1

나는 이것이 요구 사항을 충족시키지 못할 것이라고 생각합니다. 아이디어는 Javascript로 모두 입력 된 값을 기반으로 한 필드를 미리 채우는 것입니다. 서버 측에서 호출 가능한 기본값은 도움이되지 않습니다. –

+0

@Carl - 그 말이 맞습니다. 나는 그런 식으로 읽지 않았습니다. 감사. –

12

장고에 내장 된 prepopulated_fields 기능 slugify하기 위해 하드 코딩, 그것은 정말 더 일반적인 목적으로 사용할 수 없습니다.

미리 채우기를 수행하려면 고유 한 Javascript 함수를 작성해야합니다. 관리자 페이지에 포함시키는 가장 좋은 방법은 사용자 정의 양식의 또는 Widget에 포함시키는 것입니다. 그런 다음 ModelAdmin subclass을 사용자 정의 양식이나 위젯을 사용하도록 사용자 정의해야합니다. 마지막으로 onchange 핸들러를 등록하고 채울 다른 필드를 알리기 위해 미리 채워진 각 필드와 함께 인라인 자바 스크립트를 렌더링해야합니다. 나는 이것을 위젯을 통해 렌더링 할 것이다. 멋지고 선언적으로 만들려면 사용자 정의 ModelAdmin 속성 (prepopulated_fields와 유사)을 사용하고 ModelAdmin.formfield_for_dbfield를 대체하여 위젯을 작성하고 사전 입력해야하는 필드에 대한 정보를 전달하십시오.

이런 종류의 관리 해킹은 거의 항상 가능하지만 (특히 복잡한 회상에서 알 수 있듯이) 거의 단순하지 않습니다. 특히 코드를 멋지게 캡슐화하려는 노력을하는 경우 특히 그렇습니다.난 당신이 GET을 통해 일부 값을 미리 채울 수 있다는 사실을 알고

+0

+1 어떻게 작동하는지 분석합니다. – tatlar

24

는,이

http://localhost:8000/admin/app/model/add/?model_field=hello 

같은 나는 어쩌면이 당신을 도울 수, 날짜 필드와 함께 몇 가지 문제를 가지고 있지만 될 것입니다.

+0

글쎄, 나는 그것을 결코 알지 못했다! 감사합니다 : D –

+0

그것은 GENIUS입니다! 너 어떻게 찾아 냈니? 문서 도구? –

+0

권자, 기억이 안납니다 – sacabuche

10

최근에 장고 (Django)의 ModelAdmin.get_form 방법을 사용했습니다.

class MyModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(MyModelAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['my_field_name'].initial = 'abcd' 
     return form 

Yout은 base_fields를 직접 조작 할 때 부작용에주의해야합니다.

0

나는이 답변 중 몇 가지를 시도했지만 그 중 아무 것도 작동하지 않았습니다. 관련 모델의 다른 필드를 사용하여 필드를 미리 채우기 만하면됩니다. this 대답을 시작점으로 사용하여 마침내 모델 인스턴스 객체 (여기 obj)를 직접 조작하려고 시도했지만 나에게 도움이되었습니다.

class MyModelAdmin(models.ModelAdmin): 

    def get_form(self, request, obj=None, **kwargs): 
     form = super(MyModelAdmin, self).get_form(request, obj, **kwargs) 
     if not obj.some_model_field: 
      obj.some_model_field = obj.related_model.prepopulating_model_field 

     return form 
관련 문제