Создание различных мнений на основе схожей (но немного отличающейся) информации?

Я знаю, что есть лучший способ сделать это, но я не могу понять его.

Я создаю веб-приложение, в котором есть ряд одинаковых страниц, в зависимости от того, какой отдел и станцию вы выбираете.

Эту информацию я использую позже в отдельном сценарии для определения места отправки файла.

Но сейчас я использую разные представления для каждой страницы.

Например, у меня есть одно представление в моем views.py, которое выглядит следующим образом:

views.py

def FOO_station_0(request):
    Site_Data.station = 0
    Site_Data.dept = "FOO"
    ctx = {}
    ctx['station'] = Site_Data.station

    if request.method == 'POST':
        form = my_form(request.POST)

        if form.is_valid():
            try:
                Ext_Data.parsed_data = form.cleaned_data['full_scan']
                saveScan()
            except IndexError:
                ctx['error_message'] = error_message
                return HttpResponseRedirect('/error/input')

            return HttpResponseRedirect(f'/confirm')

    else:
        form = my_form()
    ctx['form'] = form
    return render(request, f'scan/FOO/FOO_station.html', ctx)

И еще один, который выглядит следующим образом:

def BAR_station_2(request):
    Site_Data.station = 2
    Site_Data.dept = "BAR"
    ctx = {}
    ctx['station'] = Site_Data.station

    if request.method == 'POST':
        form = my_form(request.POST)

        if form.is_valid():
            try:
                Ext_Data.parsed_data = form.cleaned_data['full_scan']
                saveScan()
            except IndexError:
                ctx['error_message'] = error_message
                return HttpResponseRedirect('/error/input')

            return HttpResponseRedirect(f'/confirm')

    else:
        form = my_form()
    ctx['form'] = form
    return render(request, f'scan/BAR/BAR_station.html', ctx)

Как вы видите, они оба возвращают один и тот же HTML-файл, это потому, что они очень похожи, но я хочу, чтобы URL и передаваемая информация были разными.

Мне нужно сделать это для многих разных станций, у всех разные номера отделов или станций, но в остальном все будет одинаково.

Я мог бы просто добавить по одному представлению для каждой станции, но это выглядит неаккуратно.

Мой Urls.py выглядит следующим образом:

from django.urls import path
from . import views

urlpatterns = [
...
...
    path('FOO/station_0', views.FOO_station_0, name='FOO_station_0'),
    path('FOO/station_1', views.FOO_station_1, name='FOO_station_0'),
    path('FOO/station_2', views.FOO_station_2, name='FOO_station_0'),
    path('FOO/station_3', views.FOO_station_3, name='FOO_station_0'),
...
...
    path('BAR/station_1', views.BAR_station_1, name='BAR_station_1'),
    path('BAR/station_2', views.BAR_station_2, name='BAR_station_2'),
    path('BAR/station_3', views.BAR_station_3, name='BAR_station_3'),
    path('BAR/station_4', views.BAR_station_4, name='BAR_station_4'),
...
...
]

Каждая станция возвращает свой URL, потому что этот URL связан с данными, которые я хочу передать.

Не похоже, что это лучший способ сделать это, но я не знаю, с чего начать, чтобы найти лучший способ.

Какой лучший способ сделать это в Django?

Любая помощь будет очень признательна.


Помимо ответов, данных ниже, эта ссылка также была полезна для всех, кто найдет этот вопрос в будущем.

https://docs.djangoproject.com/en/3.2/intro/tutorial03/

<<<Сначала вам нужно использовать regex в ваших урлах. С помощью этого у вас будет один или несколько урлов вместо слишком большого количества. Вот ссылка, как вы можете это сделать

захват параметров из url

В приведенной выше ссылке вы увидите, как захватить параметры из url, затем вы можете использовать эти параметры внутри вашего представления. Таким образом, у вас будет одно или несколько представлений, и вам не нужно будет добавлять по одному представлению для каждого url.

Поскольку station и dept - единственные вещи, которые изменяются, вы можете добавить их в качестве аргументов функции:

def station_view(request, dept, station_num):
    Site_Data.dept = dept
    Site_Data.station = station_num
    ctx = {}
    ctx['station'] = Site_Data.station

    if request.method == 'POST':
        form = my_form(request.POST)

        if form.is_valid():
            try:
                Ext_Data.parsed_data = form.cleaned_data['full_scan']
                saveScan()
            except IndexError:
                ctx['error_message'] = error_message
                return HttpResponseRedirect('/error/input')

            return HttpResponseRedirect(f'/confirm')

    else:
        form = my_form()
    ctx['form'] = form
    # assuming dept will always be either 'FOO' or 'BAR'
    return render(request, f'scan/{dept}/{dept}_station.html', ctx)

Затем в urls.py определите эти параметры в url, как показано ниже:

urlpatterns = [
...
    path('<dept>/station_<station_num>/', views.station_view, name='station-view'),
]

Наконец, в шаблонах вы можете связать station и dept каждого объекта с помощью чего-то вроде следующего:

{% for obj in objects %}
    <a href="url 'station-view' dept=obj.dept station_num=obj.station">obj.name<>
{% endfor %}

PS: Я предполагаю, что имя вашего контекстного объекта objects и он фактически содержит поля dept, station и name. Подгоните его под свои нужды.

Вернуться на верх