Пользовательские ссылки в django
Вот мой первоначальный код
class Article(models.Model):
article_author = models.CharField(max_length=12)
article_name = models.CharField(max_length=60)
article_body = models.TextField()
article_date = models.DateTimeField(auto_now_add=True)
article_tags = models.CharField(max_length=25, choices=tags_, null=True)
article_link = make_link()
Оказывается, она не будет добавлена в базу данных, и я не могу сделать миграцию (возможно, потому что она не является частью .models). (Я хочу, чтобы ссылка создавалась автоматически при создании экземпляра класса article, без участия пользователя)
Я могу просто сделать его CharField и затем заменить все, что там было, функцией, но это кажется небрежным решением, также это даст бесполезное поле в стандартной админ-панели.
вы можете добавить свойство link
к вашей модели как
class Article(models.Model):
...
# article_link = make_link()
@property
def link(self):
return make_link()
тогда вы сможете легко получить к нему доступ так же, как article.link
Я бы предложил генерировать ссылку на save()
и хранить ее в CharField
с editable=False
, как предложил Виллем.
Документы: https://docs.djangoproject.com/en/4.0/ref/models/fields/#editable
class Article(models.Model):
article_author = models.CharField(max_length=12)
article_name = models.CharField(max_length=60)
article_body = models.TextField()
article_date = models.DateTimeField(auto_now_add=True)
article_tags = models.CharField(max_length=25, choices=tags_, null=True)
article_link = models.CharField(max_length=200, editable=False)
def save(self):
self.article_link = make_link()
super().save()
Или, если ссылка на статью следует некоторой логике, может не быть необходимости генерировать и хранить ссылку, а обращаться к ней на лету как к свойству.
В Django для генерации URL для объекта модели используется метод get_absolute_url()
, а не свойство:
https://docs.djangoproject.com/en/4.0/ref/models/instances/#get-absolute-url
class Article(models.Model):
article_author = models.CharField(max_length=12)
article_name = models.CharField(max_length=60)
article_body = models.TextField()
article_date = models.DateTimeField(auto_now_add=True)
article_tags = models.CharField(max_length=25, choices=tags_, null=True)
@property
def article_link(self):
return make_link()