我有一个导航栏,用户可以在其中登录,登录后,用户将有一个下拉菜单,其中包含指向他/她的个人资料的链接。这是我的代码:
navbar.html:
{% url 'students:student_profile_view' as student_profile_url %}
{% if request.user.is_authenticated %}
<!-- User Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="far fa fa-user"></i> {{request.user.first_name}}</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ student_profile_url }}">Profile</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{{ logout_url }}">Logout</a>
</div>
</li>
students / urls.py:
path('profile/<slug:slug>/', views.student_profile_view, name='student_profile_view'),
students / model.py:
from django.contrib.auth.models import User
from django.utils.text import slugify
class StudentProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
slug = models.SlugField(blank=True, unique=True)
avatar = models.ImageField(upload_to='student_profile/', null=True, blank=True)
description = models.CharField(max_length=120, null=True, blank=True)
objects = models.Manager()
def save(self, *args, **kwargs):
self.slug = slugify(self.user)
super(StudentProfile, self).save(*args, **kwargs)
def __str__(self):
return self.user.username
def get_absolute_url(self):
# return 'students:student_profile_view', (), {'slug': self.slug}
return reverse("students:student_profile_view", kwargs={"slug": self.slug})
Navbar.html是基本模板,它不是通过我可以传递对象然后调用object.get_absolute_url
的视图呈现的,现在我的导航栏下拉菜单中的配置文件按钮不起作用,因为它不起作用为用户找到反向匹配。
此外,登录后,我尝试在浏览器中手动输入配置文件的链接,如下所示: 在navbar.html中有什么方法可以使用http://127.0.0.1:8000/students/profile/jimhalpert/
我收到一条错误消息,提示“ get_absolute_url
?为什么在浏览器中硬编码链接不起作用?请帮忙。
答案 0 :(得分:1)
这有点困惑。
该错误可能来自该模板的第一行,您试图在此处无误地反转.env.dusk.local
URL。显然,该URL需要一个标记,因此您需要在传递它时传递一个。 (我不明白您为什么说这个弹头是正确的;您根本没有通过。)
您似乎想要链接到当前用户的个人资料;因此,您要做有一个对象,即students:student_profile_view
。所以我不明白为什么您不首先使用它:
request.user.studentprofile
或者,因为您已经定义了未使用的<a class="dropdown-item" href="{% url 'students:student_profile_view' slug=request.user.studentprofile.slug %}">Profile</a>
方法,因此可以使用该方法:
get_absolute_url
无论哪种方式,您都应删除引起问题的第一行。