【问题标题】:Redirect with get_context_data in generic detailview django在通用detailview django中使用get_context_data重定向
【发布时间】:2018-06-30 21:10:43
【问题描述】:

我有这个视图,我需要两个模型 Book 和 UserFav,所以我为此使用了上下文:

class BookDetailView(LoginRequiredMixin, generic.DetailView):
    model = Book
    template_name = 'book_detail.html'

    def get_context_data(self, **kwargs):
        context = super(BookDetailView, self).get_context_data(**kwargs)
        context.update({
            'fav_list': UserFav.objects.filter(user=self.request.user)
        })
        return context

还有另一个视图函数

def favorite(request, pk):
    book = get_object_or_404(Book, pk=pk)
    fav, created = UserFav.objects.get_or_create(user=request.user)
    fav.favorites.add(book)
    return render(request, 'book_detail.html', {'book': book})

收藏功能的表格

<form action="{% url 'favorite' book.id %}" method="post" style="display: inline;">
{% csrf_token %}
<button type="submit" class="btn btn-danger btn-xs">
    <span class="glyphicon glyphicon-remove"></span>&nbsp; add this book to favourite
</button>

我的网址

url(r'^book/(?P<pk>\d+)$', views.BookDetailView.as_view(), name='book-detail'),
url(r'^book/(?P<pk>\d+)/f/$', views.favorite, name='favorite'),

我需要fav_list的地方

{% if fav_list %}
{% for fav in fav_list %}
{% if book in fav.favorites.all %}Favorited
{% else %}
<form action="{% url 'favorite' book.id %}" method="post" style="display:inline;">
{% csrf_token %}
<button type="submit" class="btn btn-danger btn-xs">
    <span class="glyphicon glyphicon-remove"></span>&nbsp; add this book to favourite
</button>
 </form>
 {% endif %}
 {% endfor %}
 {% else %}
 <form action="{% url 'favorite' book.id %}" method="post" style="display: inline;">
{% csrf_token %}
<button type="submit" class="btn btn-danger btn-xs">
    <span class="glyphicon glyphicon-remove"></span>&nbsp; add this book to favourite
</button>
                                </form>
 {% endif %}

现在的问题是,当我被重定向到 book_detail.html 时,我没有得到模板所需的 fav_list 如何正确重定向或使用其他方式定义视图?

【问题讨论】:

    标签: django redirect django-models


    【解决方案1】:

    您没有从 favorite 视图重定向。提交表单后,重定向是一种很好的做法。

    试试

    from django.shortcuts import redirect
    from django.urls import reverse
    
    def favorite(request, pk):
        book = get_object_or_404(Book, pk=pk)
        fav, created = UserFav.objects.get_or_create(user=request.user)
        fav.favorites.add(book)
        # if you have an app_name in urls.py file try this
        # return redirect(reverse('YOUR_APP_NAME:book-detail', args=(pk,)))
        return redirect(reverse('book-detail', args=(pk,)))
    

    我希望这会有所帮助。

    【讨论】:

    • 给出错误:找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/book/5/f/book_detail.html
    • 还有什么方法可以为这个函数声明 url?然后它可能会工作
    • 同样的错误:找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/book/7/f/book/book-detail 它适用于渲染,但只是没有获取 fav_list 对象
    • @Ahmed 好的,它不知道如何解析路径,我编辑了我的答案,使用了reverse 方法。看看吧
    猜你喜欢
    • 2011-09-21
    • 2020-02-16
    • 2012-04-09
    • 2018-06-04
    • 1970-01-01
    • 2022-11-06
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多