Использование self.id для заполнения других полей в Django - PullRequest
2 голосов
/ 18 января 2012

Я пытаюсь заполнить поле, называемое «идентификация», используя первичный ключ «id».Однако, как вы знаете, нет никакого способа узнать, каким «id» будет объект, прежде чем он будет сохранен.Поэтому я упрямо сделал это:

def save(self, *args, **kwargs):
    super(Notifications, self).save(*args, **kwargs)
    self.identification = str(self.id)

Забавно, но в консоли это работает:

>>>new = Notifications.objects.create( # some fields to be filled )
>>>new.identification
'3' (# or whatever number)

, но когда я иду на свой шаблон, чтобы получить этот объект:

{% for each in notifications %}
  Identification: {{ each.identification }}
{% endfor %}

реальность поражает:

Identification: 

Что происходит?Почему это работает в консоли, а не в шаблоне?Какой подход вы предлагаете использовать автоматически заполненное поле в других полях?.

Большое спасибо!

1 Ответ

3 голосов
/ 18 января 2012

Проблема в том, что вы не сохраняете изменения в своей базе данных.

Он работает в терминале, потому что этот конкретный экземпляр модели (объект python - очень временный) имеет заполненное свойство identification.При доступе к нему в представлении или шаблоне метод save() не был вызван, поэтому свойство / поле пустое.

Чтобы это сработало, снова вызовите save после первого сохранения.Кроме того, может иметь смысл устанавливать идентификатор только при создании модели.Один дополнительный звонок на начальное сохранение в большинстве случаев не так уж важен.

def save(self, *args, **kwargs):
    add = not self.pk
    super(MyModel, self).save(*args, **kwargs)
    if add:
        self.identification = str(self.id)
        kwargs['force_insert'] = False # create() uses this, which causes error.
        super(MyModel, self).save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...