You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中get_absolute_url无效问题求助,按教程操作仍失败

解决get_absolute_url不生效的问题

嘿,我一眼就发现问题所在啦!你在模板里调用了object.get_absolute_url,但你的Tweet模型里完全没定义这个方法——这就是它失效的核心原因!教程里能正常工作,是因为人家的模型里实现了这个方法哦。

先看你的现有代码:

模板代码:

{% for object in object_list %}
<div class="media">
  <div class="media-left">
    <a href="#">
      {% if object.img %}
      <img class="media-object" src="..." alt="...">
      {% endif %}
    </a>
  </div>
  <div class="media-body">
    {{ object.content }}<br/>
    via {{ object.user }} | {{ object.timestamp|timesince }} ago |
    <a href='{{ object.get_absolute_url }}'>View</a>
  </div>
</div>
<hr/>
{% endfor %}

views.py代码:

# Create your views here.
class TweetCreateView(FormUserNeededMixin, CreateView):
    form_class = TweetModelForm
    template_name = 'tweets/create_view.html'

class TweetUpdateView(LoginRequiredMixin, UserOwnerMixin, UpdateView):
    form_class = TweetModelForm
    queryset = Tweet.objects.all()
    template_name = 'tweets/update_view.html'
    success_url = '/tweets/'

class TweetDeleteView(LoginRequiredMixin, DeleteView):
    model = Tweet
    template_name = 'tweets/delete_confirm.html'
    success_url = reverse_lazy('tweets:home')

class TweetDetailView(DetailView):
    template_name = "tweets/detail_view.html"
    queryset = Tweet.objects.all()

    def get_object(self):
        print(self.kwargs)
        pk = self.kwargs.get("pk")
        print(pk)
        return Tweet.objects.get(id=pk)

class TweetListView(ListView):
    template_name = "tweets/tweets_list.html"

    def get_queryset(self, *args, **kwargs):
        qs = Tweet.objects.all()
        print(self.request.GET)
        query = self.request.GET.get("q", None)
        if query is not None:
            qs = qs.filter(Q(content=query))
        return qs

    def get_context_data(self, *args, **kwargs):
        context = super(TweetListView, self).get_context_data(*args, **kwargs)
        context['create_form'] = TweetModelForm()
        context['create_url'] = reverse_lazy('tweets:create')
        return context

models.py代码:

class Tweet(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, )
    content = models.CharField(max_length=140, validators=[ validate_content ])
    updated = models.DateField(auto_now=True, )
    timestamp = models.DateField(auto_now_add=True, )

    def __str__(self):
        return str(self.content)

解决步骤:

1. 在Tweet模型中添加get_absolute_url方法

你需要先导入reverse,然后在模型里定义这个方法,返回对应TweetDetailView的URL。修改后的models.py如下:

from django.urls import reverse  # 别忘了导入这个!
from django.conf import settings

class Tweet(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, )
    content = models.CharField(max_length=140, validators=[ validate_content ])
    updated = models.DateField(auto_now=True, )
    timestamp = models.DateField(auto_now_add=True, )

    def __str__(self):
        return str(self.content)
    
    # 新增这个方法!
    def get_absolute_url(self):
        # 这里的URL name要和你urls.py里配置的一致
        return reverse('tweets:detail', kwargs={'pk': self.pk})

2. 确认URL配置(关键!)

确保你的urls.py里已经为TweetDetailView配置了正确的URL,比如:

from django.urls import path
from .views import TweetDetailView

app_name = 'tweets'  # 命名空间要和reverse里的一致

urlpatterns = [
    # 其他URL配置...
    path('<int:pk>/', TweetDetailView.as_view(), name='detail'),
]

做完这两步,模板里的{{ object.get_absolute_url }}就能正确生成指向单条Tweet详情页的链接啦!

内容的提问来源于stack exchange,提问作者Nilesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:20