URL не меняется при отправке формы? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть несколько категорий, таких как рестораны, спорт и фитнес, фаст-фуд и т. Д. c .. Я хочу создать раскрывающееся меню со всеми категориями и отображать различные элементы категории каждый раз при выборе другой категории:

HTML:

<form action="{% url 'show-all-objects' category=category page_num=1 %}" method="POST" id="sort_form">
    <select data-placeholder="Categories:" class="utf_chosen_select_single" id="select_sort_category" name="select_sort_category" onchange="this.form.submit()">
        <option>Категориии</option>
        <option value="restaurants">Ресторанти</option>
        <option value="sportfitness">Спортни и фитнес</option>
        <option value="carservice">Автосервизи</option>
        <option value="beautysalon">Салони за красота</option>
        <option value="fastfood">Бързо хранене</option>
        <option value="carwash">Автомивки</option>
        <option value="fun">Забавлание</option>
        <option value="other">Други</option>
    </select>
</form>

Хорошо, это первая ссылка:

http://localhost:8000/objects/all/restaurants/1/

Затем из <select> выберите секунду опция со значением sportfitness Она обновляет sh страницу и показывает элементы из категории sportfitness, но URL-адрес по-прежнему http://localhost:8000/objects/all/restaurants/1/ После этого выберите третий параметр со значением carservice Страница снова refre sh, на этот раз URL-адрес изменяется http://localhost:8000/objects/all/sportfitness/1/ вместо carservices, поэтому задержка 1 раз.

urls.py:

from django.urls import path, re_path
from . import views

urlpatterns = [
    path('user/<int:pk>/', views.UserObjectsView.as_view(), name='user-objects'),
    path('add/<str:category>/', views.add_object, name='add-object'),
    path('<str:category>/<int:pk>/<int:page_num>/', views.show_object, name='show-object'),
    #path('all/<str:category>/<int:page_num>/', views.show_all_objects, name="show-all-objects"),
    re_path(r'all/(?P<category>\w+)/(?P<page_num>\d+)/?/(?P<city>\d+)?', views.show_all_objects, name="show-all-objects"),
]

views.py:

def show_all_objects(request, category, page_num, city=None):
    params_map = {
        'restaurants': Restaurant,
        'sportfitness': SportFitness,
        'carservice': CarService,
        'beautysalon': BeautySalon,
        'fastfood': FastFood,
        'carwash': CarWash,
        'fun': Fun,
        'other': Other,
    }

    if request.method == 'POST':
        category = request.POST.get('select_sort_category')

    objects = Object.objects.instance_of(params_map.get(category)).order_by('rating')


    if city is not None:
        objects = objects.filter(city=city)

    paginator = Paginator(objects, 2)
    objects = paginator.get_page(page_num)

    context = {
        'objects': objects,
        'category': category,
        'page_num': page_num,
    }

    return render(request, 'show_all_objects.html', context)

Я могу предоставить больше информации по мере необходимости. Вероятно, это не проблема Django, это обычная проблема программирования, я не совсем уверен.

1 Ответ

0 голосов
/ 27 февраля 2020

Почему это происходит?

render функция не меняет URL.


Как ее решить?

Вместо выполнения запроса на публикацию на category that your view возвращается, сделайте почтовый запрос на category that you select.

, например, если ваш текущий URL http://localhost:8000/objects/all/restaurants/1/, и вы выбираете sportfitness, тогда вместо выполнения запроса на http://localhost:8000/objects/all/restaurants/1/ сделать почтовый запрос на http://localhost:8000/objects/all/sportfitness/1/.

Вот как вы можете это сделать:

var url = "{% url 'show-all-objects' category=category page_num=1 %}";
var urlCategory = "{{ category }}";

$('#select_sort_category').on('change', function () {
    $('#sort_form').attr('action', url.replace(urlCategory, this.value)).submit();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...