django - 在通用detailview django中使用get_context_data重定向
问题描述
我有这个视图,我需要两个模型 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> 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> 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> add this book to favourite
</button>
</form>
{% endif %}
现在的问题是,当我被重定向到 book_detail.html 时,我没有得到模板所需的 fav_list 如何正确重定向或使用其他方式来定义视图?
解决方案
您没有从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,)))
我希望这将有所帮助。
推荐阅读
- android - android ftrace:current_tracer 无法写入,但我有可用的跟踪器
- firebase - 如何使用 flutter_geofire 将实时位置发送到 Cloud Firestore?
- stripe-payments - 向现有客户添加付款方式
- postgresql - pg_dump - 如何在 postgresql 中备份公共模式中的所有视图?
- r - 如何将 mutate 和 IF 语句结合在一起?
- google-cloud-ml - 在 Vertex AI 上的 Kubeflow Pipelines 中运行 ID
- javascript - 在 midijs 中循环播放音频?
- javascript - 创建从 PDF 计算数据的工具
- c# - 如何获取和解析 CI 管道中所有生成的 coverage.cobertura 文件?
- java - 错误:服务“环境”必须是映射而不是数组