python - 从相似(但略有不同)的信息中得出不同的观点?

标签 python django django-views

我知道有更好的方法可以做到这一点,但我无法弄清楚。
我正在制作一个具有一系列相同页面的 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/

最佳答案

stationdept是唯一可以更改的内容,您可以将它们添加为函数的参数:

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'),
]
最后在模板中,您可以关联每个对象的 stationdept像下面这样:
{% for obj in objects %}
    <a href="url 'station-view' dept=obj.dept station_num=obj.station">obj.name<>
{% endfor %}
PS:我假设您的上下文对象名称是 objects它实际上包含字段 dept , stationname .适合您的需求。

关于python - 从相似(但略有不同)的信息中得出不同的观点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68954920/

相关文章:

python - 使用 Pandas 数据框将一列中的对列表转换为两列

python - cv2.VideoWriter 只生成空文件

Django postgresql 删除所有表和 syncdb

python - Django Rest Framework 未从我的数据库检索数据

django - 动态创建 Django View 不好吗?

python - 链表中的冒泡排序。如何使其按艺术家姓名排序?

python - PyGame 角色离开屏幕

python - 使用 Django Forms 编辑 UserProfile

python - 在 GET 请求中检索相关字段的对象,否则在 POST、PUT、DELETE 等中仅使用对象的 ID

django - 打开新的浏览器选项卡会使 Django 的 CSRF token 失效,从而阻止表单提交