我知道有更好的方法可以做到这一点,但我无法弄清楚。
我正在制作一个具有一系列相同页面的 Web 应用程序,具体取决于您选择的部门和车站。
这是我稍后在单独的脚本中使用的信息,以确定将文件发送到何处。
但是现在我对每个页面使用不同的 View 。
例如,我的 views.py 中有一个 View ,如下所示:
View .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 和传递的信息不同。我需要为许多不同的车站执行此操作,所有车站都有不同的部门或车站编号,但除此之外,它是相同的。
我可以只为每个站添加一个 View ,但这感觉很草率。
我的 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/
最佳答案
自 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
.适合您的需求。
关于python - 从相似(但略有不同)的信息中得出不同的观点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68954920/