【问题标题】:Pass pk into another template in Django将 pk 传递给 Django 中的另一个模板
【发布时间】:2018-03-01 14:15:33
【问题描述】:

所以基本上我想要做的就是使用带有 pk 的生成链接:

让我们说127.0.0.0:8000/27/

通过 if 语句访问该 pk 以在另一个模板中使用它 例如:

{% 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
    )

【问题讨论】:

  • 您的问题令人困惑。写{% if book.pk == category.pk %} 没有意义。仅仅因为一本书和一个类别具有相同的主键并不意味着它们是相关的。
  • 我的意思是,只有当它来自那个“类别”时才想将“书”添加到列表中,问题是类别列表是一个不同的模板,而书籍是另一个,所以我虽然我可以比较 ID 以确保这本书属于该类别。
  • 我们无法判断一本书如何链接到某个类别,因为您没有展示您的模型。

标签: django django-models django-templates django-views


【解决方案1】:

您可以从带有self.kwargs['pk'] 的URL 中获取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 %}

我在视图或v.BookList.as_view(slug="pk") 中看不到slug="pk" 的必要性,因此我将其删除。

urlpatterns = [
    ...
    path('<int:pk>/',v.BookList.as_view()),
    ...
]

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2021-06-30
    • 1970-01-01
    • 2016-11-17
    • 2020-03-26
    • 2011-11-20
    相关资源
    最近更新 更多