【问题标题】:Django get_absolute_url calling same URL as current pageDjango get_absolute_url 调用与当前页面相同的 URL
【发布时间】:2022-01-22 10:07:35
【问题描述】:

我正在尝试向我的 Django 网站上的页面添加“+ 新评论”链接,该链接会将您带到“uuid:pk/new_review/”页面,该页面包含用于提交特定帖子 URL 的表单。我目前面临链接重定向到同一页面的问题,我认为这个问题源于我使用 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>
...

【问题讨论】:

    标签: python django url view model


    【解决方案1】:

    问题不在于get_absolute_url 本身:它将返回一个空字符串,因为上下文中没有new_review

    您应该使用:

    &lt;a href="<strong>{% url 'new_review' pk=listing_detail.pk %}</strong>"&gt;+ New Review&lt;/a&gt;

    【讨论】:

    • 谢谢威廉,如果我使用 url 语法,我可以让它工作,但我希望使用 get_absolute_url() 函数传递主键以遵循最佳实践,这不是有可能吗?
    • @MaxMeade: 不,上下文中没有 new_review 对象,而且绝对没有 listing_id 对象。
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多