繁体   English   中英

Django:当我使用基于类的视图时,如何在views.py 中获得“pk”?

[英]Django: How Can I get 'pk' in views.py when I use class based views?

我正在使用基于类的视图扭曲应用程序。 当我使用通用 DetailView 加载页面时,我需要在 views.py 文件中接收“pk”。

我的 urls.py 文件:

from django.urls import path
from . views import HomeView, ProfileView, AddPetView, EditPetView, DeletePetView, 
PetProfileView

urlpatterns = [
...
path('profile/pet/<int:pk>', PetProfileView.as_view(), name='pet_profile'),
path('', HomeView.as_view(), name='home'),
]

我的views.py 文件:

from django.shortcuts import render
from django.views.generic import TemplateView, ListView, UpdateView, CreateView, DeleteView, 
DetailView
from django.urls import reverse_lazy
from . models import Pet

class PetProfileView(DetailView):
    model = Pet
    template_name = 'pet_profile.html'
    #key = Pet.objects.values_list('birth_date').get(pk=1)

我的宠物模型是:

class Pet(models.Model):
pet_name = models.CharField(max_length=255)
pet_breed = models.CharField(max_length=255)
pet_type = models.CharField(max_length=255)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
pet_reg_date = models.DateField(auto_now_add=True) # when the pet is registered in the site
birth_date = models.DateField()

def __str__(self):
    return self.pet_name + ' | ' + str(self.owner)

# def get_absolute_url(self):
#   return reverse('article-detail', args=str(self.id))
def get_absolute_url(self):
    return reverse('profile')

当我为某些宠物加载配置文件时,我需要进入我的视图类 PetProfileView(DetailView): 就像这个特定宠物的出生日期的变量一样。 我会用这个日期做一些计算

我需要从这个特定宠物的数据库 birh_date 列中提取。 如何得到这个 pk=? 当我加载 pet_profile 页面时?

我不确定我是否能很好地描述这个案例。 如果有什么不清楚的,可以问我。 我将再次尝试解释。

基于类的视图:

self.kwargs['pk']

所以,在你的情况下

class PetProfileView(DetailView):
    model = Pet
    template_name = 'pet_profile.html'
    def get_context_data(self, **kwargs):
        context['key'] = self.get_object().birth_date
        return context

我不知道你想用“key”变量做什么。 此示例用于您的模板。 您可以使用{{key}}{{object.birth_date}}访问“birth_date”

如前所述,您可以访问 URL 参数,例如self.kwargs["pk"] 但是由于您已经在使用DetailView ,它已经提供了通过其 id 检索对象的功能,您可以自定义它使用的查询集:

class PetProfileView(DetailView):
    model = Pet
    template_name = 'pet_profile.html'
    queryset = Pet.objects.values_list('birth_date')

(虽然不这样做你也应该能够在你的模板中访问pet.birth_date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM