【问题标题】:Can anyone help me with this issue - Django View (Passing of keys)谁能帮我解决这个问题 - Django View (Passing of keys)
【发布时间】:2021-11-13 19:44:51
【问题描述】:

我有以下看法:

def device_port(request):
    devices = Device.objects.all()
    if request.method == "POST":
        selected=request.POST.get('device')
        devices = Device.objects.get(pk=selected)        
        tablename = 'dev_interface_'+selected
        print("tablename: " +tablename)
        cursor=connection.cursor()
        cursor.execute(f"SELECT interface FROM {tablename} WHERE id >=2")
        righttable = cursor.fetchall()         
        return redirect('/device/port/selected',{'devices':devices, 'selected': selected, 'righttable':righttable} )        
    return render(request, 'interface/device_port.html',{'devices':devices})

def device_port_selected(request, pk):    
    if request.method == "POST":
        job = JobForm(request.POST)
        device = devices.hostname
        print(devices)
        #job.associateddevice = devices.hostname
        try:
            selection=request.POST.get('portrange')
        except:
            selection = ""
            messages.warning(request, "Please select the ports")
        print(selection)
        #job.associatedinterface = selection
        return render(request, 'interface/device/port/selected/'+device+'.html',{'devices':devices, 'righttable':righttable} )        
    return render(request, 'interface/device_port_selected.html',{'devices':devices, 'selected': selected, 'righttable':righttable} )

urls.py

urlpatterns = [
    path('', views.home, name='interface-home'),
    path('device/', DeviceListView.as_view(), name='interface-device'),
    path('device_edit/<int:pk>/', views.device_edit, name='device-edit'),
    path('device_delete/<int:pk>/', views.device_delete, name = 'device-delete'),
    path('device_add/', views.device_add, name='device-add'),
    path('device/port/', views.device_port, name='device-port'),
    path('device/port/selected/', views.device_port_selected, name='device-port-selected'),
    path('device/routeport/', views.device_routeport, name='device-routeport'),
    path('interface/', views.interface_list, name='interface-list')
]

device_port.html

<form method="POST">
 <div class="form-row align-items-center">
  <div class="col-md-5 my-1">                                                 
   {% csrf_token %}
   <label for="Hostname">Hostname</label>
    <div class="input-group">
     <select id = "list" class="custom-select mr-sm-2"  onchange="getSelectValue();">
      <option selected>Select</option>
      {% for device in devices %}
       <option value={{device.id}}>{{device.hostname}}</option>
      {%endfor%}
      </select>
      <div class="input-group-append">                                                                            
       <button class="btn btn-outline-secondary" type="submit">Go</button>
      </div>
     </div>
    </div>                                                              
   </div>                                                                                                                  
  <input type ="text" name="device" id= "txtvalues" style="display:none">
</form>

所以我在这里处理 2 页(/device/port/device/port/selected)。在第一页 /device/port 中,用户需要从下拉框中选择一个值并按下按钮 Go。从这里,它打算转到下一页,即/device/port/selected,将第一页中的选定值传递到下一页。

但是使用以下代码,我收到了错误

device_port_selected() missing 1 required positional argument: 'pk'

从第一页移动到下一页时。

【问题讨论】:

    标签: html django django-views


    【解决方案1】:

    您不能将上下文字典传递给redirect。第二个参数应该是 URL 参数,而不是上下文。所以更改以下行:

    return redirect('/device/port/selected',{'devices':devices, 'selected': selected, 'righttable':righttable} )
    

    return redirect('device-port-selected', pk=selected)
    

    请注意,最好使用 URL 的名称(即device-port-selected)而不是整个路径,因为您可以在将来更改路径而不会影响其余代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多