Python 德扬戈。获取模板中当前使用的对象

Python 德扬戈。获取模板中当前使用的对象,python,django,Python,Django,我对Django比较陌生。目前我正在为一个朋友的狗窝写一个网页。我有一个base.html和一个狗的列表。通过点击他们中的任何一个,你可以进入他们的个人资料(其中包含一个子模板profile.html),该个人资料根据狗的名字存在于他们各自的URL上 我的问题是我不能引用模板中的dog对象。我需要拿出狗的名字,描述和图像 这是我的档案: models.py class dog(models.Model): name = models.CharField(max_length=30, bl

我对Django比较陌生。目前我正在为一个朋友的狗窝写一个网页。我有一个base.html和一个狗的列表。通过点击他们中的任何一个,你可以进入他们的个人资料(其中包含一个子模板profile.html),该个人资料根据狗的名字存在于他们各自的URL上

我的问题是我不能引用模板中的dog对象。我需要拿出狗的名字,描述和图像

这是我的档案:

models.py

class dog(models.Model):
    name = models.CharField(max_length=30, blank=False, null=True)
    main_image = models.ImageField(upload_to='dogs', blank=False, null=True)
    description = models.TextField(max_length=500, blank=False, null=True)
    slug = AutoSlugField(populate_from='name')
views.py

def home(request):
    dog_list = dog.objects.all()
    template = 'base_extend.html'
    return render(request, template, {'dogs' : dog_list})

def dog_view(request, name):    
    dog_list = dog.objects.all()
    dog_view = get_object_or_404(dog, name=name)
    return render(request, 'profile.html', locals())
base.html

{% for dog in dogs %}
<a href="{% url 'profile' dog.name %}">
<div class="col-sm-4">
<img class="img-circle img-responsive img-center" src="{{ dog.main_image.url }}" height=400px width=400px alt="">
    <h2 align=center>{{ dog.name }} 
    {% if dog.gender == 'ML' %}
        &#9794; 
    {% else %} 
        &#9792;
    {% endif %}</h2>
    <p>{{ dog.description }}</p>
</div></a>
{%for dog in dogs%}
在profile.html中,我需要以下内容:

<img src="{{ dog.main_image.url }}">
    <h2>{{ dog.name }}</h2>
    <p>{{ dog.description }}</p>

{{dog.name}
{{dog.description}}

如何引用狗的对象,为其创建当前URL?变量{name}只返回字符串,{{dog_list}返回创建的所有狗的列表

{{dog_list.1}}(或任何其他数字)几乎满足了我的需要,只是我不知道如何获得当前狗的号码


谢谢你把这么长的问题读到最后。我希望你能给我答案,因为我在互联网上搜索了所有的地方,都找不到答案(或者我提出了错误的要求)。谢谢。

您将希望像在
主页中一样填充dictionary对象,而不是调用locals()显式优于隐式。

def dog_view(request, name):
    dog_list = dog.objects.all()
    dog_view = get_object_or_404(dog, name=name)

    return render(request, 'profile.html', {'dogs': dog_list,
                                            'dog': dog_view}

为了解释实际问题,您在模板中引用了
dog.attribute
,但通过调用
locals()
它将
dog\u view
作为对象引用传递。如果您坚持使用局部变量(我不建议这样做),您需要在模板中引用
dog\u view.attribute

您需要像在
主视图中那样填充字典对象,而不是调用局部变量()显式优于隐式。

def dog_view(request, name):
    dog_list = dog.objects.all()
    dog_view = get_object_or_404(dog, name=name)

    return render(request, 'profile.html', {'dogs': dog_list,
                                            'dog': dog_view}

为了解释实际问题,您在模板中引用了
dog.attribute
,但通过调用
locals()
它将
dog\u view
作为对象引用传递。如果你坚持使用局部变量(我不推荐),你需要在模板中引用
dog\u view.attribute

你只需将视图中的dog对象作为上下文变量传递给模板,然后你就可以访问狗的属性,如名称、描述等(在本例中)
dog\u view.name
dog\u view.description
dog\u view.main\u image.url
。如果打印出
locals()
,您将看到这是局部变量+值和参数的dict。因此,在这个dict中有
“dog\u view”:,…
所以实际上您已经在传递dog实例了


但是,正如您在另一个答案中所看到的,您最好将它们显式地传递给模板,我不建议使用
locals()

您只需将视图中的dog对象作为上下文变量传递给模板,然后您就可以通过这样做(在本例中)访问dog的属性,如名称、描述等
dog\u view.name
dog\u view.description
dog\u view.main\u image.url
。如果打印出
locals()
,您将看到这是局部变量+值和参数的dict。因此,在这个dict中有
“dog\u view”:,…
所以实际上您已经在传递dog实例了


但是,正如您在另一个答案中看到的,您最好将这些明确地传递给您的模板,我不建议使用
locals()

谢谢。我不知道locals()和填充字典之间的区别,所以我甚至没有想到问题会出现。从现在起,我将坚持使用字典。非常感谢。本地人是一本字典。globals也是。当然,这是一本词典,但它并不明确——这就是导致他的问题的原因。我修改了答案,删除了“实际”一词。好吧,字典和当地人是一个偏好的问题。结果都一样。主要的症结在于,当您使用
dog
而不是
dog\u view
时,缺少的上下文属性名称不会在模板中引发KeyError。。它可以对locals()或Python代码中的显式字典执行此操作。然而,Django模板是为了容忍缺少的引用而构建的,它只是忽略它们。对最终用户来说更健壮,但这让您有责任小心。我不同意/不同意泰勒的观点,但无论哪种方式,模板参考中的傻瓜都可以选择。谢谢。我不知道locals()和填充字典之间的区别,所以我甚至没有想到问题会出现。从现在起,我将坚持使用字典。非常感谢。本地人是一本字典。globals也是。当然,这是一本词典,但它并不明确——这就是导致他的问题的原因。我修改了答案,删除了“实际”一词。好吧,字典和当地人是一个偏好的问题。结果都一样。主要的症结在于,当您使用
dog
而不是
dog\u view
时,缺少的上下文属性名称不会在模板中引发KeyError。。它可以对locals()或Python代码中的显式字典执行此操作。然而,Django模板是为了容忍缺少的引用而构建的,它只是忽略它们。对最终用户来说更健壮,但这让您有责任小心。我不同意/不同意泰勒的观点,但无论哪种方式,模板引用中的错误都是可以接受的。