Я создаю систему уведомлений для компании, где пользователи-администраторы могут создавать проекты и добавлять в них пользователей.Модель проекта имеет 9 атрибутов, но я хочу показывать только 3 или 4 поля при создании проекта, но отображать их все при обновлении существующего проекта.
Это изменение нужно будет отразить только на DjangoАдминистратор сайта, поэтому я расширил ProjectAdmin с помощью своего собственного ProjectForm, где я расширил метод init , чтобы проверить, является ли он новым экземпляром, и, если это так, удалить определенные поля.
# models.py
class Project(models.Model):
project_number = models.IntegerField()
name = models.CharField(max_length=100)
permit = models.CharField(max_length=100, blank=True, default='')
is_active = models.BooleanField(default=True)
users = models.ManyToManyField(CustomUser, blank=True, related_name='project_users')
# add a default
levels = models.ManyToManyField('Level', blank=True, related_name='project_levels')
total_contract_hours = models.IntegerField(default=0, blank=True, verbose_name='Total Design Hours')
hours_used = models.IntegerField(default=0, blank=True, verbose_name='Total Design Hours Used')
notes = models.ManyToManyField('notes.ProjectNote', related_name='core_project_notes', blank=True)
history = HistoricalRecords()
def __str__(self):
ret_str = "{} {}".format(self.project_number, self.name)
if self.permit:
ret_str += " | Permit: {}".format(self.permit)
return ret_str
# admin.py
class ProjectForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ProjectForm, self).__init__(*args, **kwargs)
attrs = {'class': 'form-control', 'required': True}
if self.instance and self.instance.pk is None:
# creating project
exclude = ['is_active', 'users', 'levels', 'hours_used', 'notes']
for field in exclude:
try:
del self.fields[field]
except ValueError:
print('{} does not exist'.format(field))
for field in self.fields.values():
field.widget.attrs = attrs
class Meta:
model = Project
fields = ['project_number', 'name', 'total_contract_hours']
class ProjectAdmin(admin.ModelAdmin):
form = ProjectForm
fields = ['project_number', 'name', 'permit', 'is_active', 'users', 'levels', 'total_contract_hours', 'hours_used', 'notes']
Как я уже говорил, мне нужны только базовые поля Project при создании, но отображаются все атрибуты при обновлении существующего Project.Только с этими изменениями я теперь получаю KeyError:
KeyError: «Ключ is_active» не найден в «ProjectForm». Возможны следующие варианты: имя, разрешение, номер_проекта, total_contract_hours. "
Однако, когда я печатаю доступные поля, он возвращает OrderedDict со всеми атрибутами модели в качестве ключей.Что я делаю неправильно?Спасибо!