Можно ли использовать get_absolute_url в тегах {% url%} без объекта модели? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть панель навигации, где пользователь может войти в систему, и после входа в систему у пользователя будет раскрывающееся меню со ссылкой на его / ее профиль.Вот мои коды:

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>

студентов / 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/ Я получаю сообщение об ошибке: Обратное для 'student_profile_view' без аргументов не найдено.Приведено 1 рисунков: ['студентов / профиль / (? P [-a-zA-Z0-9 _] +) / $'] Уверяю вас, слизняк правильный.

Есть ли способ использовать get_absolute_url в navbar.html?почему не работает жесткое кодирование ссылки в браузере?Пожалуйста помоги.

1 Ответ

1 голос
/ 20 апреля 2019

Все это немного запутано.

Ошибка предположительно происходит из первой строки этого шаблона, когда вы пытаетесь изменить URL students:student_profile_view без слагов.Понятно, что для этого URL-адреса требуется слаг, поэтому вам нужно пропустить его, когда вы измените его.(Я не понимаю, почему вы говорите, что слаг является правильным; вы вообще его не пропускаете.)

Похоже, вы хотите сослаться на профиль текущего пользователя;таким образом, у вас действительно есть объект, а именно request.user.studentprofile.Поэтому я не понимаю, почему вы просто не используете это в первую очередь:

<a class="dropdown-item" href="{% url 'students:student_profile_view' slug=request.user.studentprofile.slug %}">Profile</a>

или, поскольку вы определили метод get_absolute_url, который вы не используете, вы можете использовать его:

<a class="dropdown-item" href="{{ request.user.studentprofile.get_absolute_url }}">Profile</a>

В любом случае, вы должны удалить ту первую строку, которая вызывает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...