2011-02-03 4 views
13

모델이 Foo입니다. 여러 데이터베이스 속성과 여러 요소를 조합하여 계산 된 여러 속성이 있습니다. 이 계산 된 속성을 데이터베이스 속성 인 것처럼 사용자에게 제공하고 싶습니다. (backing factor는 사용자 입력을 반영하여 변경 될 것입니다.) Django admin 인터페이스로 이것을 할 수있는 방법이 있습니까?Django : 관리자 인터페이스에서 필드 위장?

+0

관리자 변경 목록 또는 양식에 표시 하시겠습니까? –

+0

@lazerscience 관리자 변경 목록이 무엇인지 잘 모르겠습니다. 확실히 양식. –

+0

양식에서 (표시되고 편집 할 수없는) 항목을 표시하고 모델의 메소드로 사용할 수있게하려면 "change_form.html"파일을 $ {TEMPLATE_ROOT}/admin/APPNAME/MODELNAME/change_form.html을 편집하여 마음의 내용을 편집하십시오. –

답변

30

Foo (FooAdminForm)의 모델 폼을 서브 클래 싱하여 데이터베이스에서 지원하지 않는 필드를 추가하는 것이 좋습니다. 사용자 정의 유효성 검사는 ModelForm의 clean_* 메소드에있을 수 있습니다.

FooAdminsave_model 메서드 내부에 요청을 받으면 Foo 인스턴스와 양식 데이터가 있으므로 인스턴스 저장 전후의 데이터 처리를 모두 할 수 있습니다. 난 (인스턴스 데이터

을 기반으로

from django import forms 
from django.db import models 
from django.contrib import admin 


class Foo(models.Model): 
    name = models.CharField(max_length=30) 


class FooAdminForm(forms.ModelForm): 
    # custom field not backed by database 
    calculated = forms.IntegerField() 

    class Meta: 
     model = Foo 


class FooAdmin(admin.ModelAdmin): 
    # use the custom form instead of a generic modelform 
    form = FooAdminForm 

    # your own processing 
    def save_model(self, request, obj, form, change): 
     # for example: 
     obj.name = 'Foo #%d' % form.cleaned_data['calculated'] 
     obj.save() 


admin.site.register(Foo, FooAdmin) 

사용자 정의 필드의 초기 값을 제공 : 여기

장고 관리자에 등록 된 사용자 지정 양식을 가진 모델에 대한 예입니다 이것이 최선의 해결책인지 확실하지 않지만 작동해야합니다.)

databa의 기존 모델 인스턴스에 대한 modelform se가 생성되면이 인스턴스가 전달됩니다. 그래서 FooAdminForm의 __init__에서는 인스턴스 데이터를 기반으로 필드 속성을 변경할 수 있습니다.

def __init__(self, *args, **kwargs): 
     # only change attributes if an instance is passed    
     instance = kwargs.get('instance') 
     if instance: 
      self.base_fields['calculated'].initial = (instance.bar == 42) 
     forms.ModelForm.__init__(self, *args, **kwargs) 
+0

좋아 보인다. 그러나,'IntegerField' 대신'CheckboxInput'을 사용하면, 나타나지 않습니다. 또한, 어떻게 체크 박스의 초기 값을 설정할 수 있습니까? 'check_true' 함수는 필드의 "value"를 받겠지만, 그 값이 무엇인지 어떻게 설정합니까? –

+0

CheckBoxInput을 기본 위젯으로 사용하는'BooleanField'를 사용하십시오. django의 폼 필드는'initial ='키워드 인수를 받아들입니다. 예를 들면 :'bar = forms.BooleanField (initial = True)' –

+0

. Backing Model 인스턴스의 함수로 초기 값을 설정하려면 어떻게해야합니까? –

1

편집 양식에서 readonly_fields (1.2 이상)에 속성 이름을 입력하십시오.

변경 목록에서 list_display에 넣으십시오.

+2

하지만 편집 가능한 속성을 원합니다. 데이터베이스 행에 직접 해당하는 것은 아니므로 적절하게 백엔드 데이터를 변경하려면 자체 처리를 수행해야합니다. –

1

당신은 모델에 @property의 장식을 사용할 수 있습니다 (파이썬> = 2.4) :

class Product(models.Model): 

    @property 
    def ranking(self): 
     return 1 

다음 list_display에서 사용할 수있는 "순위"

class ProductAdmin(admin.ModelAdmin): 
    list_display = ('ranking', 'asin', 'title') 
+1

'@ property'는 필요하지 않습니다. 'list_display' 모델 (또는 ModelAdmin) –

4

그것은 쉽게 변경 목록에 임의의 데이터를 표시하거나 양식에 필드를 표시하려면 다음을 수행하십시오. list_display은 모델 또는 Modeladmin에 정의 된 실제 모델 특성 또는 메소드를 임의로 취하며 사용자는 하위 폼 forms.ModelForm을 사용하여 변경 양식에 입력 할 필드 유형을 추가하십시오.

두 가지를 결합하는 것, 즉 list_editable을 지정하여 내부에서 편집 할 수있는 변경 목록에있는 임의의 데이터 조각이있는 것은 훨씬 어렵거나 불가능합니다. Django는 데이터베이스 필드에 해당하는 실제 모델 속성 만 허용하는 것으로 보입니다. (모델 정의의 메소드에 @property을 사용해도 충분하지 않음).

변경 목록 페이지에서 실제로 모델에없는 필드를 편집하는 방법을 발견 한 사람이 있습니까?

+1

에 대한 모든 메서드를 받아 들일 것입니다 그 대답을 얻고 싶습니다. – haki

관련 문제