diff --git a/boards/models/post/__init__.py b/boards/models/post/__init__.py --- a/boards/models/post/__init__.py +++ b/boards/models/post/__init__.py @@ -146,18 +146,7 @@ class Post(models.Model, Viewable): def get_absolute_url(self, thread=None): # Url is cached only for the "main" thread. When getting url # for other threads, do it manually. - url = self.url - - if url is None: - if thread is None: - thread = self.get_thread() - opening = self.is_opening() - opening_id = self.id if opening else thread.get_opening_post_id() - url = reverse('thread', kwargs={'post_id': opening_id}) - if not opening: - url += '#' + str(self.id) - - return url + return self.url def get_thread(self): return self.thread @@ -309,9 +298,14 @@ class Post(models.Model, Viewable): except ObjectDoesNotExist: pass - def build_url(self): - self.url = self.get_absolute_url() - self.save(update_fields=['url']) + def _build_url(self): + opening = self.is_opening() + opening_id = self.id if opening else self.get_thread().get_opening_post_id() + url = reverse('thread', kwargs={'post_id': opening_id}) + if not opening: + url += '#' + str(self.id) + + return url def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -329,8 +323,9 @@ class Post(models.Model, Viewable): super().save(force_insert, force_update, using, update_fields) - if self.url is None: - self.build_url() + if new_post: + self.url = self._build_url() + super().save(update_fields=['url']) def get_text(self) -> str: return self._text_rendered