将pk传递到Django中的另一个模板

问题描述 投票:0回答:1

基本上我想做的是使用生成的链接与pk:

让我们说127.0.0.0:8000/27/

访问该pk以便在另一个带有if语句的模板中使用它,例如:

{% for book in Books %}
{% if book.pk == category.pk %}
     <!-- Generate some HTML here-->

在我的项目中,我通过将对象的pk作为变量传递来生成链接,例如:

{% for category in Categories %}
<a href="{{ category.pk }}">

在我的主要urls.py中:

...
path('<int:pk>/',v.BookList.as_view(slug="pk")),
...

在我的app / views.py中:

class BookList(LoginRequiredMixin, ListView):
login_url = 'accounts/login/'

template_name = 'ListsViews/BookList.html'
model = Book
context_object_name = "Books"
slug = "pk"

def get_object(self, queryset=None):
    return queryset.get(slug=self.slug)

在app / models.py中

class Category(models.Model)
    book_name = models.CharField(
        max_length=10,
        default=_lazy('Tech'),
        choices=Grade
    )

class Book(models.Model)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    book_name = models.CharField(
        max_length=10,
        default=_lazy('Learn Python'),
        choices=Grade
    )
django django-models django-templates django-views
1个回答
0
投票

您可以使用pk从URL获取self.kwargs['pk']。列表视图没有get_object方法 - 您应该重写get_queryset

class BookList(LoginRequiredMixin, ListView):
    login_url = 'accounts/login/'

    template_name = 'ListsViews/BookList.html'
    model = Book

    context_object_name = "books"  # NB Usual style in Django is lowercase books instead of Books

    def get_queryset(self):
        return super(BookList, self).get_queryset().filter(category=self.kwargs['pk'])

这意味着您的查询集将只包含该类别的书籍,因此您不必检查模板中的类别。

{% for book in books %}
  {{ book }}
{% endfor %}

我认为在视图或slug="pk"中不需要v.BookList.as_view(slug="pk"),所以我会删除它。

urlpatterns = [
    ...
    path('<int:pk>/',v.BookList.as_view()),
    ...
]
© www.soinside.com 2019 - 2024. All rights reserved.