Параметр django вызывает неправильный шаблон и представление для рендеринга - PullRequest
0 голосов
/ 04 ноября 2018

Обзор / Проблема:

Привет! Неправильный шаблон и представление загружаются каждый раз, когда я нажимаю ссылку check_tier_level в моем шаблоне.

Когда этот параметр включен, он загружает домашнее представление с "check_tier_level" как special_message, хотя мои ссылки переходят в представление для check_tier_level. Если я нажимаю любую из кнопок формы, чтобы предоставить доступ, в этом месте появляется соответствующее сообщение. Я просто не могу проверить уровень.

Приложение работает нормально и отображает нужный шаблон / представление только при удалении параметра special_message из urlpattern и представления.

Единственное другое преимущество, которое у меня есть, это то, что URL в браузере также будет выглядеть как http://127.0.0.1:8000/tiered_access_app/Tier 1 granted!/ вместо экранирования символов с помощью %20 и т. Д.

Моя цель

Единственная причина, по которой я хочу сохранить этот параметр, заключается в том, что special_message может уведомлять пользователей о последних обновлениях на основе их действий. Если кто-нибудь знает лучший способ сделать это без создания совершенно нового представления / шаблона (которое, как я знаю, является решением и как это сделать) , я хотел бы знать как. В любом случае, вот мой код:

urlpatterns.py

path('', views.home, name='home'),
path('<str:special_message>/', views.home, name='home_special_message'),
path('check_tier_level/', views.check_tier_level, name='check_tier_level'),
path('check_tier_level/gain_access/', views.gain_access, name='gain_access'),

views.py

def home(request, special_message=None):
    return render(request, 'tiered_access_app/home.html', {'special_message': special_message})

def check_tier_level(request):
    current_user = request.user
    try:
        find_user = TieredAppCustomUser.objects.get(user=current_user)
        if find_user.tier_choice == 'tier1':
            return render(request, 'tiered_access_app/check_tier_level.html', {'level_1': 'You have access to level 1.'})
        # and so on with other levels...
    except ObjectDoesNotExist:
        pass
    return render(request, 'tiered_access_app/check_tier_level.html', {'no_access': 'You don\'t have access to the content here yet.'})

home.html

{% if special_message %}
    <h2>{{ special_message }}</h2>
{% endif %}

<form action="{% url 'tiered_access_app:gain_access' %}" method="POST">
    {% csrf_token %}
    <label>Check level 1 access</label>

        <!-- *******PROBLEM WITH LINK HERE******** -->
    <p><a href="{% url 'tiered_access_app:check_tier_level' %}">Try to access level 1 first.</a> You won't be allowed unless you gain access first, by clicking the button below.</p>
        <!-- *******PROBLEM WITH LINK HERE******** -->

    <input type="hidden" value='1' name="tier_level">
    <input type="submit" value="Enable level 1">
</form>

1 Ответ

0 голосов
/ 04 ноября 2018

Я выяснил это:

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

path('', views.home, name='home'),
path('check_tier_level/', views.check_tier_level, name='check_tier_level'),
path('check_tier_level/gain_access/', views.gain_access, name='gain_access'),
path('<str:special_message>/', views.home, name='home_special_message'),

Единственная разница здесь и то, что я имею ниже, это позиция 2-й функции, которая переходит к home. Я собираюсь оставить этот вопрос на случай, если кто-то еще столкнется с этой же проблемой. Я не знаю, почему это заставило это работать, но это сделало. Теперь все работает отлично.

...