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
相关产品推荐
相关产品推荐

