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

Django : HTML form action directing to view (or url?) with 2 arguments

大约一周前开始学习 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 时,我会收到 Noreverse 错误,因为我的 url 参数是主键。

指向urls.py:

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

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

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

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

在您的 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/

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

Django 3.0 模式

Django 如何处理请求

基本:

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

详细阅读:

Official Django Documentations How Django processes a request


这些是你的 URL 模式:

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
  • 可读代码 - 干净的代码