【问题标题】:django's user.get_absolute_url doesn't work in templatedjango 的 user.get_absolute_url 在模板中不起作用
【发布时间】: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


【解决方案1】:

引用 OP 的评论:

我更新到 1.7.1,现在一切正常。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2015-09-19
    • 2021-01-10
    相关资源
    最近更新 更多