【发布时间】:2015-02-12 23:21:12
【问题描述】:
我是 Django 的新手,在 Django 内置用户对象中使用 get_absolute_url 时遇到问题,在模板中使用它。 我正在使用 Django 1.7。
所以,这是在 models.py 中:
def get_absolute_url(self):
return reverse('tests:profile', kwargs={'pk': self.pk})
在 urls.py 中:
url(
regex=r'^profile/(?P<pk>\d+)',
view = views.profile,
name='profile'
)
views.py:
def profile(req, pk):
user = get_object_or_404(models.User, pk=pk)
return render(req, 'accounts/profile.html', {'user': user})
在模板中
<div class="container">
{% if user.is_authenticated %}
<a href="{{ user.get_absolute_url }}">{{ user.username }}</a>
<a href="{% url 'tests:logout' %}">Log out</a>
{% else %}
<a href="{% url 'tests:login' %}">Log in</a>
<a href="{% url 'tests:register' %}">Sign up</a>
{% endif %}
{% block content %}
{% endblock %}
在 html 中的 href 为空。当我使用 {% url 'tests:profile' user.pk %} 时,它运行得非常好,并且在配置文件页面上,当用户对象不是 Django 的内置对象但从我看来,get_absolute_url 有效。从 shell 中的对象调用 get_absolute_url 也可以正常工作。
在 1.7 发行说明中写道:“在您自己的自定义用户对象上定义 get_absolute_url() 方法,或者如果您想要用户的 URL,请使用 ABSOLUTE_URL_OVERRIDES。”
所以我的方法应该有效还是我误解了什么? 如何让内置用户的 get_absolute_url 按预期工作?
【问题讨论】:
-
我不明白您的
get_absolute_url实际定义在哪里。你说它是“在 models.py 中”,但是你说这是 Django 自己的用户模型,那么你怎么能在一个你无法控制的类中定义它呢?您确实意识到这是一种方法,并且必须存在于相关类中,对吗?由于您使用的是内置模型,因此您应该使用替代方案 ABSOLUTE_URL_OVERRIDES,如文档所述。 -
感谢您的回答。是的,我的错,我继承了 django 的 User 模型,并认为 django 会以某种方式处理我的方法。我现在尝试在 settings.py 中将 ABSOLUTE_URL_OVERRIDES 用作
ABSOLUTE_URL_OVERRIDES = { 'auth.user': lambda u: "/profile/%s/" % u.pk, },但它似乎并没有改变什么,我应该做点别的事情来完成这项工作吗? UPD 我更新到 1.7.1,现在一切正常。再次感谢您的帮助。 -
@fed_tf:我已将您在评论中的解决方案转换为答案。
标签: python django django-templates