。あなたがobj引数を受け取るのが分かるように、それはNone
がadd(変更時にはNone
ではない)にのみあります。 そこから、obj is None
の場合にのみフォームフィールド "name"を除外するフォームを使いこなすことができます。
Django 1.10では、その方法はdjango.contrib.admin.options.ModelAdmin.get_form
です。
EDIT 1(これは、これまでで最高のソリューションではありません) 私はここにあなたの完全な解決策を与えることはできませんが、あなたのような何かを始めることができます:
# admin.py
from django.contrib import admin
from models import Toys
class ToysModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
# all the code you have in the original
# django.contrib.admin.options.ModelAdmin.get_form
# up to the last try except
if obj is not None:
defaults['fields'] = ('tags', 'price', 'status',)
try:
return modelform_factory(self.model, **defaults)
except FieldError as e:
raise FieldError(
'%s. Check fields/fieldsets/exclude attributes of class %s.'
% (e, self.__class__.__name__)
)
admin.site.register(Toys, ToysModelAdmin)
EDIT 2それを行うには(これが良い例です)
# admin.py
from collections import OrderedDict
from django.contrib import admin
from models import Toys
class ToysModelAdmin(admin.ModelAdmin):
# this is not perfect as you'll need to keep track of your
# model changes also here, but you won't accidentally add
# a field that is not supposed to be editable
_add_fields = ('tags', 'price', 'status',)
def get_form(self, request, obj=None, **kwargs):
model_form = super(ToysModelAdmin, self).get_form(
request, obj, **kwargs
)
if obj is None:
model_form._meta.fields = self._add_fields
model_form.base_fields = OrderedDict(**[
(field, model_form.base_fields[field])
for field in self._add_fields
])
return model_form
一つの方法は、CSSのUSIを使用して隠れていますngクラス名 – karthikr
私はdjango管理パネルでこのフィールドを非表示にします。他の方法? –