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 如何处理请求
基本:
- 首先 Django 检查匹配 URL。
- 如果匹配到URL则调用定义的视图来处理请求。 (成功)
- 如果 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
- 可读代码 - 干净的代码
大约一周前开始学习 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 如何处理请求
基本:
- 首先 Django 检查匹配 URL。
- 如果匹配到URL则调用定义的视图来处理请求。 (成功)
- 如果 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
- 可读代码 - 干净的代码