管理者では、オブジェクトを変更するときはフィールドを無効にしますが、新しいオブジェクトを追加するときは必須にします。
Django=この方法についてはどうですか?
管理者の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でテストされています
参考:他の誰かが私が遭遇したのと同じ2つの問題に遭遇した場合:
Readonly_fieldsクラス属性は検証からアクセスされるため、クラスの本体で永続的にreadonly_fieldsを宣言する必要があります(Django.contrib.admin.validation:validate_base()、line.213 appxを参照)
Get_readonly_fields()に渡されたobjが親objであるため、これはInlinesでは機能しません(cssまたはjsを使用する2つのかなりハッキングされた低セキュリティのソリューションがあります)
以前の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の「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', )}),
)
例: http://code.djangoproject.com/svn/Django/trunk/Django/contrib/auth/admin.py
しかし、これは「add_objX」のその後の変更からモデルを保護しません。これも必要な場合は、Modelクラスの「保存」関数を調べて、そこで変更を確認する必要があると思います。
参照:www.djangoproject.com/documentation/models/save_delete_hooks/
グリーズ、ニック
これを行うには、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)