django 관리자는 obj를 수정할 때 필드를 읽기 전용으로 만들지 만 새 obj를 추가 할 때 필요합니다.
관리자에서 개체를 수정할 때 필드를 비활성화하고 싶지만 새 개체를 추가 할 때 필요하도록합니다.
이것에 대해 장고 방식은 무엇입니까?
관리자의 get_readonly_fields방법을 재정의 할 수 있습니다 .
class MyModelAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if obj: # editing an existing object
return self.readonly_fields + ('field1', 'field2')
return self.readonly_fields
변경보기 에서만 모든 필드를 읽기 전용 으로 설정 하려면 관리자의 get_readonly_fields를 재정의합니다.
def get_readonly_fields(self, request, obj=None):
if obj: # editing an existing object
# All model fields as read_only
return self.readonly_fields + tuple([item.name for item in obj._meta.fields])
return self.readonly_fields
그리고 당신이 변화 뷰 버튼 저장 숨기려면 :
보기 변경
def change_view(self, request, object_id, form_url='', extra_context=None): ''' customize edit form ''' extra_context = extra_context or {} extra_context['show_save_and_continue'] = False extra_context['show_save'] = False extra_context['show_save_and_add_another'] = False # this not works if has_add_permision is True return super(TransferAdmin, self).change_view(request, object_id, extra_context=extra_context)사용자가 편집을 시도하는 경우 권한 변경 :
def has_add_permission(self, request, obj=None): # Not too much elegant but works to hide show_save_and_add_another button if '/change/' in str(request): return False return True이 솔루션은 Django 1.11 에서 테스트되었습니다.
참고 : 다른 사람이 내가 겪은 동일한 두 가지 문제에 직면 한 경우 :
readonly_fields 클래스 속성은 유효성 검사에서 액세스되므로 클래스 본문에 영구적으로 readonly_fields를 선언해야합니다 (django.contrib.admin.validation : validate_base (), line.213 appx 참조).
이것은 get_readonly_fields ()에 전달 된 obj가 부모 obj이기 때문에 인라인에서 작동하지 않습니다 (css 또는 js를 사용하는 다소 해키하고 보안 수준이 낮은 솔루션이 두 개 있습니다)
Bernhard Vallant의 이전 훌륭한 제안을 기반으로 한 변형으로, 기본 클래스 (있는 경우)에서 제공하는 가능한 모든 사용자 정의도 보존합니다.
class MyModelAdmin(BaseModelAdmin):
def get_readonly_fields(self, request, obj=None):
readonly_fields = super(MyModelAdmin, self).get_readonly_fields(request, obj)
if obj: # editing an existing object
return readonly_fields + ['field1', ..]
return readonly_fields
ModelAdmin의 formfield_for_foreignkey 메소드를 재정 의하여이를 수행 할 수 있습니다.
from django import forms
from django.contrib import admin
from yourproject.yourapp.models import YourModel
class YourModelAdmin(admin.ModelAdmin):
class Meta:
model = YourModel
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
# Name of your field here
if db_field.name == 'add_only':
if request:
add_opts = (self._meta.app_label, self._meta.module_name)
add = u'/admin/%s/%s/add/' % add_opts
if request.META['PATH_INFO'] == add:
field = db_field.formfield(**kwargs)
else:
kwargs['widget'] = forms.HiddenInput()
field = db_field.formfield(**kwargs)
return field
return admin.ModelAdmin(self, db_field, request, **kwargs)
비슷한 문제가 있습니다. ModelAdmin에서 "add_fieldsets"및 "restricted_fieldsets"로 해결했습니다.
from django.contrib import admin
class MyAdmin(admin.ModelAdmin):
declared_fieldsets = None
restricted_fieldsets = (
(None, {'fields': ('mod_obj1', 'mod_obj2')}),
( 'Text', {'fields': ('mod_obj3', 'mod_obj4',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('add_obj1', 'add_obj2', )}),
)
Please see e.g.: http://code.djangoproject.com/svn/django/trunk/django/contrib/auth/admin.py
But this doesn't protect your model from later changes of "add_objX". If you want this too, I think you have to go the way over the Model class "save" function and check for changes there.
See: www.djangoproject.com/documentation/models/save_delete_hooks/
Greez, Nick
'Program Club' 카테고리의 다른 글
| 줄 바꿈 방지 (0) | 2020.10.11 |
|---|---|
| 소프트 키보드에서 뒤로 버튼 차단 (0) | 2020.10.11 |
| Git의 대소 문자 구분 (0) | 2020.10.11 |
| onActivityResult에서 DialogFragment 표시 (0) | 2020.10.11 |
| Android Gradle에서 versionCode를 자동 증가시키는 방법 (0) | 2020.10.11 |