В общем, сижу я сейчас над такое проблемой. Надо позволять ручной ввод номера проекта при его создании. Номер имеет свою структуру и никак с PK не связан, хотя уникален. Считаем это наследием. После создания проекта данный номер никак поменять нельзя.
Подошёл к проблеме так:
Обеспечил запрет изменения поля при редактировании объекта:
# admin.py
class ProjectAdmin(ModelAdmin):
...
def get_form(self, request, obj=None, **kwargs):
self.exclude = []
# поле кода проекта разрешено редактировать только при создании проекта
if obj:
self.readonly_fields += ('code', )
return super(ProjectAdmin, self).get_form(request, obj, **kwargs)
Обеспечил заполнение пустого поля при создании объекта:
# models.py
class Project(models.Model):
code = models.CharField(max_length=9, blank=True, null=True, unique=True, verbose_name=_(u'Code'), help_text=_(u'In format: {xxxx}A{nn}{yy}'))
...
def save(self, *args, **kwargs):
# при создании модели необходимо сгенерировать код проекта,
# если он не был явно указан
if not self.pk and 0 == len(self.code):
code = self.customer.code
count = Project.objects.filter(customer__code=code).count()
tpl = '{customer_code:0>4}A{project_number:0>2}{year:0>2}'
context = dict(
customer_code=code,
project_number=count + 1,
year=date.today().strftime('%y'))
self.code = tpl.format(**context)
return super(Project, self).save(*args, **kwargs)
Вроде задача простейшая и должно всё взлететь, ан нет.
Нажимаем на "Создать проект", открывается форма на которой присутствует поле code
, всё нормально. Заполняем поле, сохраняем проект с возвратом на эту же страницу. Поле code
отредактировать больше не удаётся. По-прежнему, всё нормально.
Открываем на редактирование любой существующий проект - проблем нет.
Теперь снова нажимаем на "Создать проект" и получаем готовую к заполнению форму с закрытым для редактирования полем code
!
Причём, что интересно, если в get_form()
добавить вызов отладчика и там сразу же продолжить выполнение кода, то таких глюков с полем нет.
Пробовал чистить *.pyc, не помогло.