Создание различных мнений на основе схожей (но немного отличающейся) информации?
Я знаю, что есть лучший способ сделать это, но я не могу понять его.
Я создаю веб-приложение, в котором есть ряд одинаковых страниц, в зависимости от того, какой отдел и станцию вы выбираете.
Эту информацию я использую позже в отдельном сценарии для определения места отправки файла.
Но сейчас я использую разные представления для каждой страницы.
Например, у меня есть одно представление в моем 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/
В приведенной выше ссылке вы увидите, как захватить параметры из 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
. Подгоните его под свои нужды.