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
将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?)的主要内容,如果未能解决你的问题,请参考以下文章
在 SAFARI 中使用带有表单身份验证的 HTML5 音频