Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Django устанавливает значение по умолчанию для поля модели в собственный атрибут

Автор вопроса: user1545895Ответов: 2

У меня есть модель под названием Fattura, и я хотел бы установить значение по умолчанию для поля "для печати" на строку, которая включает значение поля "numero".

Но у меня есть ошибка, что link_fattura имеет меньше аргументов, но если я добавлю default=link_fattura(self), у меня будет ошибка, потому что self не определено.

Как я могу решить эту проблему?

class Fattura(models.Model):
        def link_fattura(self, *args, **kwargs):
                return u"http://127.0.0.1:8000/fatture/%s/" % (self.numero)
        data = models.DateField()
        numero = models.CharField("Numero", max_length=3)
        fatturaProForma = models.ForeignKey(FatturaProForma)
        printable = models.CharField("Fattura stampabile", max_length=200, default=link_fattura)
        def __unicode__(self):
                return u"%s %s" % (self.data, self.numero)
        class Meta:
                verbose_name_plural = "Fatture"
                ordering = ['data']

djangomodeldefault-valuefield

Ответы

Ответ 1 · рейтинг 2 · Daniel Roseman

Вы не можете сделать это, используя аргумент default. Лучше всего переопределить метод save:

def save(self, *args, **kwargs):
    if not self.id and not self.printable:
        self.printable = self.link_fattura()
    return super(Fattura, self).save(*args, **kwargs)

Ответ 2 · Hedde van der Heide

Извините, я неправильно прочитал ваш вопрос, это невозможно без javascript, потому что ваша модель еще не была сохранена на этом этапе.

Вы можете предсказать URL-адрес, выполнив что-то вроде:

def link_facttura(self):
    if not self.id:
        return some_url/fattura/%d/ % Fattura.objects.latest().id+1
    return u""

Но это некрасиво и может привести к ошибкам, как только вы начнете удалять записи.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы