Django的。获取模板中当前使用的对象

时间:2016-04-20 20:37:37

标签: python django

我对Django比较新。目前我正在为朋友的狗窝写一个网页。我有一个带有狗列表的base.html。通过点击它们中的任何一个,你可以根据狗的名字转到他们自己的相应网址上的个人资料(带有子模板profile.html)。

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

以下是我的文件:

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>

在profile.html中,我需要以下内容:

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

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

{{dog_list.1}}(或任何其他数字)几乎可以满足我的需要,除了我不知道如何获得当前狗的数量。

感谢您阅读这么久的问题。我希望你的回答,因为我在互联网上搜索,无法找到答案(或者我做错了请求)。谢谢。

2 个答案:

答案 0 :(得分:0)

您需要像在home视图中一样填充字典对象,而不是调用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_view作为对象引用传递。如果您坚持使用本地人(我不建议这样做),您需要在模板中引用dog_view.attribute

答案 1 :(得分:0)

您可以将视图中的狗对象作为上下文变量传递给模板,然后通过执行(在本例中)dog_view.name来访问狗的属性,如名称,描述等。 ,dog_view.descriptiondog_view.main_image.url。如果你打印出locals(),你会发现这是你的局部变量+值和args的字典。所以,在这个词典中你有"dog_view": <Dog object>, ...所以你实际上已经传递了狗实例。

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