У меня есть ниже urlpatterns
в корне url.py
:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls'), name="api_app"),
]
, где api
приложение содержит:
app_name="api_app"
urlpatterns = [
url(r'^users/', views.UserList.as_view()),
url(r'^users/(?P<user_type>[a-zA-Z_]+)$', views.UserList.as_view(), name="filter_type"),
...,
]
первый url
отображает списокпользователей, а второй url
принимает тип пользователя и фильтрует список пользователей с помощью user_type
Они оба работают нормально, когда я помещаю URL-адреса в адресную строку браузера. Однако, когда я пытаюсь сослаться на второй URL из шаблона django следующим образом:
<form action="{% url "api_app:filter_type" user_type %}" method="GET">
<select name="user_type" class="userType">
<option value="none">Select user type</option>
<option value="A">A/option>
<option value="B">B</option>
<option value="C">C</option>
</select>
<input type="submit" value="Submit">
</form>
Произошла ошибка ниже:
NoReverseMatch at /api/users/
Reverse for 'filter_type' with arguments '('',)' not found. 1 pattern(s) tried: ['api/users/(?P<user_type>[a-zA-Z_]+)$']
Почему это так? неправильно ли сконфигурированы пространства имен?
Проблема, очевидно, в том, что user_type
нигде не определено, что я понимаю. Но с указанным выше тегом <Select>
, как я могу определить user_type
как выбранный параметр в html?
update
Это мое мнение, что я хочу передать данные user_type
до:
class UserList(APIView):
renderer_classes = [TemplateHTMLRenderer]
def get(self, request, user_type=None):
filters = {}
if user_type:
filters['user_type'] = user_type
users = User.objects.filter(**filters)
serializer = UserSerializer(users, many=True)
return Response({"data": json.dumps(serializer.data)}, template_name="users.html")