Django:HTML表单操作指向使用2个参数查看(或url?)

时间:2017-02-24 14:19:06

标签: html django django-forms django-views django-urls

大约一周前开始学习django并碰壁。非常感谢任何启蒙......

models.py

<br>

HTML

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

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

    def __str__(self):
        return self.course

urls.py(怀疑我是否有效......)

                        <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>

view.py

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

想知道表单操作是否可以将操作指向

(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或course = q1)?

非常感谢任何建议。几个小时一直在盯着这个。

2 个答案:

答案 0 :(得分:11)

您正在尝试在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/

答案 1 :(得分:8)

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

Django 3.0模式

Django如何处理请求

基本:

  1. 首先Django检查匹配的URL。
  2. 如果URL匹配,则调用定义的视图以处理请求。 (成功)
  3. 如果URL不匹配/找不到,则Django会调用错误“找不到页面”

详细阅读:

Official Django Documentations How Django processes a request


这些是您的网址格式:

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

如果您要将url模式从当前更改为,则urlpatterns中的第三个参数:

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

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

例如:

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

<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中编写服务器端验证
  • 可读代码-干净代码