Django get_absolute_url 调用与当前页面相同的 URL
Django get_absolute_url calling same URL as current page
我正在尝试将“+ 新评论”link 添加到我的 Django 网站上的一个页面,该页面会将您带到一个 'uuid:pk/new_review/' 页面,该页面包含一个表单以提交 URL 对于特定的 post。我目前面临 link 重定向到同一页面的问题,我认为问题源于我对 get_absolute_url() 的使用,我仍然无法理解它。
urls.py
urlpatterns = [
path('<uuid:pk>/', ListingDetailView.as_view(), name = 'listing_detail'),
path('<uuid:pk>/new_review/', NewReview.as_view(), name = 'new_review'),
]
views.py
class ListingDetailView(LoginRequiredMixin, DetailView):
model = Listing
template_name = 'listing/listing_detail.html'
context_object_name = 'listing_detail'
login_url = 'account_login'
class NewReview(LoginRequiredMixin, CreateView):
model = Review
template_name = 'listing/new_review.html'
fields = ['review']
context_object_name = 'new_review'
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.listing_id = get_object_or_404(Listing, pk = self.kwargs['pk'])
return super().form_valid(form)
models.py
class Review(models.Model):
listing_id = models.ForeignKey(
Listing,
on_delete=models.CASCADE,
related_name='reviews',
)
user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
)
review = models.TextField(max_length=5000)
def __str__(self):
return self.listing_id
def get_absolute_url(self):
return reverse('listing_detail', args=[str(self.listing_id)])
listing_detail.html
...
<p><a href="{{ new_review.get_absolute_url }}">+ New Review</a></p2>
...
问题不在于 get_absolute_url
本身:这将 return 一个空字符串,因为上下文中没有 new_review
。
你应该与:
一起工作
<a href="<strong>{% url 'new_review' pk=listing_detail.pk %}</strong>">+ New Review</a>
我正在尝试将“+ 新评论”link 添加到我的 Django 网站上的一个页面,该页面会将您带到一个 'uuid:pk/new_review/' 页面,该页面包含一个表单以提交 URL 对于特定的 post。我目前面临 link 重定向到同一页面的问题,我认为问题源于我对 get_absolute_url() 的使用,我仍然无法理解它。
urls.py
urlpatterns = [
path('<uuid:pk>/', ListingDetailView.as_view(), name = 'listing_detail'),
path('<uuid:pk>/new_review/', NewReview.as_view(), name = 'new_review'),
]
views.py
class ListingDetailView(LoginRequiredMixin, DetailView):
model = Listing
template_name = 'listing/listing_detail.html'
context_object_name = 'listing_detail'
login_url = 'account_login'
class NewReview(LoginRequiredMixin, CreateView):
model = Review
template_name = 'listing/new_review.html'
fields = ['review']
context_object_name = 'new_review'
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.listing_id = get_object_or_404(Listing, pk = self.kwargs['pk'])
return super().form_valid(form)
models.py
class Review(models.Model):
listing_id = models.ForeignKey(
Listing,
on_delete=models.CASCADE,
related_name='reviews',
)
user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
)
review = models.TextField(max_length=5000)
def __str__(self):
return self.listing_id
def get_absolute_url(self):
return reverse('listing_detail', args=[str(self.listing_id)])
listing_detail.html
...
<p><a href="{{ new_review.get_absolute_url }}">+ New Review</a></p2>
...
问题不在于 get_absolute_url
本身:这将 return 一个空字符串,因为上下文中没有 new_review
。
你应该与:
一起工作<a href="<strong>{% url 'new_review' pk=listing_detail.pk %}</strong>">+ New Review</a>