django 参数导致错误的模板和视图呈现

django parameter causing the wrong template and view to render

概述/问题:

嗨!每次单击模板中的 check_tier_level link 时,都会加载错误的模板和视图。

当该参数存在时,它将 "check_tier_level" 作为 special_message 加载主页视图,即使我的 link转到 check_tier_level 的视图。如果我单击任何表单按钮以授予访问权限,正确的消息会显示在该位置。我只是无法检查水平。

只有当我从 url 模式和视图中删除 special_message 参数时,该应用程序才能正常运行并呈现正确的模板/视图。

我唯一的其他线索是浏览器中的 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>

我想通了:

我所要做的就是将我的 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'),

这里和我下面的唯一区别是转到 home 的第二个函数的位置。我打算留下这个问题,以防其他人遇到同样的问题。我不知道为什么这让它起作用,但它确实起作用了。现在一切正常。