Django : HTML 表单操作指向带有 2 个参数的视图(或 url?)

Posted

技术标签:

【中文标题】Django : HTML 表单操作指向带有 2 个参数的视图(或 url?)【英文标题】:Django : HTML form action directing to view (or url?) with 2 arguments 【发布时间】:2017-07-15 10:08:34 【问题描述】:

大约一周前开始学习 django,结果碰壁了。真的很感激任何启示......

models.py

class data(models.Model):
    course = models.CharField(max_length = 250)

    def __str__(self):
        return self.course

html

将models.course中的对象转换为schlist

<link rel="stylesheet" type="text/css" href="% static '/chosen/chosen.css' %" />
<form action=% views.process %  method="GET">
      <div>
        <h4 style="font-family:verdana;">First Course: </h4>
        <select data-placeholder="Course" style="width:350px;" class="chosen-select" tabindex="7">
          <option value=""></option>
          % for item in schlist %
          <option>  item  </option>
          % endfor %
        </select>
      </div>
      </br>
      <div>
        <h4 style="font-family:verdana;">Second Course:</h4>
        <select data-placeholder="Course" style="width:350px;" class="chosen-select" tabindex="7">
          <option value=""></option>
          % for item in schlist %
          <option>  item  </option>
          % endfor %
        </select>
      </div>
      </br>
  <input type="submit" value="Compare!" />
</form>

urls.py(我怀疑这是否可行……)

urlpatterns = [
    url(r'^(\d+)/(\d+)$',views.process, name = 'process'),
]

view.py

def process(request,q1 ,q2):
    obj1= get_object_or_404(Schdata, course = q1)
    obj2= get_object_or_404(Schdata, course = q2)
 ........

想知道表单动作是否可以将动作引导到

(1) view.py 或 (2) url.py(最终到 view.py)并选择了 2 个参数?

如果是这样,表单操作应该如何? view ? 或 url ?。我是否错过了 HTML 中参数的定义?

指向views.py:

用户输入CharField,可以使用get_object_or_404获取模型pk。但是,在定义我的 urls.py 时,我会收到一个 Norreverse 错误,因为我的 url 参数是主键。

指向 urls.py:

网址参数是主键。从我的看法来看,我需要将我的用户输入 Charfield 神奇地转换为 pk,然后再将其传递给 urls.py

在 django 中有 get() 的(或)函数吗?例如get_object_or_404(pk = q1 or course = q1)?

非常感谢任何建议。盯着这个看了好几个小时。

【问题讨论】:

您找到适合上述问题的解决方案了吗? 【参考方案1】:

您正在尝试在 Django 中使用反向解析 url。

在您的 html 文件中,正确的表单操作 url 如下,方法应该是 POST:

<form action=% url 'process' %  method="POST">

如果您尝试传递参数,请使用:

<form action=% url 'process' request.user.id 4 %  method="POST">

参考: https://docs.djangoproject.com/en/1.10/topics/http/urls/

【讨论】:

【参考方案2】:

是的,我迟到了,但它可以帮助其他人更好地了解 Django 如何处理请求。

Django 3.0 模式

Django 如何处理请求

基本:

    首先 Django 检查匹配的 URL。 如果 URL 匹配,则调用定义的视图来处理请求。 (成功) 如果 URL 不匹配/找不到 Django 调用错误页面未找到

详细阅读:

Official Django Documentations How Django processes a request


这些是您的网址格式:

urlpatterns = [ path('profile/edit/<int:pk>/',views.editprofile, name='editprofile'),]

urlpatterns 中的第三个参数用于将 url 模式从当前更改为此:

urlpatterns = [ url('profile/edit/user/id/<int:pk>',views.editprofile, name = 'editprofile'),]

您无需在使用 url 名称的所有模板中重新定义 url 模式。

例如:

这是我的模板 profile.html,我在其中使用了 url 名称而不是硬编码的 url。

<a class="item" href="% url 'editprofile' user.id %" >Edit profile </a>

您的问题的解决方案:

.html

仅在模板中使用 url 名称而不是硬编码的 url 并传递参数。

<form action=% process no_of_arguments  %  method="POST">

views.py

您可以在这里处理您的请求

def process(request,no_of_arguments):

成为优秀的 django 开发人员

您还可以将 Django ModelForms 用于您的模型。 使用模型表单或简单表单,您可以做多种事情

模块化方法 以相关形式编写服务器端验证,而不是在 views.py 中进行 可读代码 - 干净代码

【讨论】:

以上是关于Django : HTML 表单操作指向带有 2 个参数的视图(或 url?)的主要内容,如果未能解决你的问题,请参考以下文章

Django 动态表单,带有 HTML 数组的表单集

如何使用带有 html 的 Django 表单制作提交按钮

带有内联表单集的 Django 表单验证

在 SAFARI 中使用带有表单身份验证的 HTML5 音频

如何构建 django ajax 模态弹出表单(带有服务器端表单)?

防止 Django 模板表单中的重定向