可以在没有模型对象的情况下在{%url%}标签中使用get_absolute_url吗?

时间:2019-04-19 21:06:20

标签: django

我有一个导航栏,用户可以在其中登录,登录后,用户将有一个下拉菜单,其中包含指向他/她的个人资料的链接。这是我的代码:

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的视图呈现的,现在我的导航栏下拉菜单中的配置文件按钮不起作用,因为它不起作用为用户找到反向匹配。

此外,登录后,我尝试在浏览器中手动输入配置文件的链接,如下所示:http://127.0.0.1:8000/students/profile/jimhalpert/ 我收到一条错误消息,提示“ Reverse,未找到任何参数。尝试了1个模式:['学生/个人资料/(?P [-a-zA-Z0-9 _] +)/ $'] ,我向您保证,该子弹是正确的。 / p>

在navbar.html中有什么方法可以使用get_absolute_url?为什么在浏览器中硬编码链接不起作用?请帮忙。

1 个答案:

答案 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

无论哪种方式,您都应删除引起问题的第一行。