【问题标题】:Django form using HTML template使用 HTML 模板的 Django 表单
【发布时间】:2017-06-26 11:31:54
【问题描述】:

我是 Django 新手,我一直在尝试将此表单发布到 POST。我已经阅读了有关表单的文档,但我有点困惑,因为如果我创建 forms.py 文件,我不确定如何实现 Jquery 日期选择器或下拉菜单。

我已经创建了模板,我可以访问它,它的格式完全符合我的要求,但是我无法确定如何将它发送到 POST。想法是获取表单中的数据并将其插入 Postgres 表中。

模板提交.py

{% extends 'website/header.html' %}
{% block content %}
    <p><b>Submit Job</b></p>
    <form action="" method="post">
    {% csrf_token %}
        <b>Select Asset to transcode</b>
        <p>Material ID:
            <input type="text" name="material_id" size="30" value="" id="keyword"/>
        </p>
        <p>Profile:
            <select name="workflow">
                <option value="">Select a transcode Profile</option>
                {%  for i in object_list %}
                    <option value="{{ i.name }}">{{ i.name }}</option>
                {% endfor %}
            </select>
        </p>
        <script>
            $(function() {
                $( "#start_datepicker" ).datepicker({
                    dateFormat: 'dd-mm-yy'
                });
            });
        </script>
        <p>License Start Date: <input type="text" id="start_datepicker" name="start_date"></p>
        <script>
            $(function() {
                $( "#end_datepicker" ).datepicker({
                    dateFormat: 'dd-mm-yy'
                });
            });
        </script>
        <p>License End Date: <input type="text" id="end_datepicker" name="end_date"></p>
        <p>
            <input type="submit" name="submit" />
        </p>
    </form>
{% endblock %}

Views.py

from django.shortcuts import render

def submit(request):
    if request.method == 'POST':
        material_id = request.POST['material_id']
        workflow = request.POST['workflow']
        start_date = request.POST['start_date']
        end_date = request.POST['end_date']
        return render(request, 'submit/submit.html')

    else:
        return render(request, 'submit/submit.html')

这是我得到的错误:

Method Not Allowed (POST): /submit/
[08/Feb/2017 17:28:49] "POST /submit/ HTTP/1.1" 405 0

我做错了什么?

编辑

这里是 URL 文件:

我的网站 url.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('website.urls')),
    url(r'^submit/', include('submit.urls')),
    url(r'^repo/', include('asset_db.urls')),
]

提交 url.py

from django.conf.urls import url
from django.views.generic import ListView
from asset_db.models import Profiles

urlpatterns = [
    url(r'^$', ListView.as_view(queryset=Profiles.objects.all().order_by("id"), template_name='submit/submit.html')),
]

【问题讨论】:

    标签: python django django-forms django-templates


    【解决方案1】:

    您正在为该 url 使用 ListView。但 ListView 只允许 GET 请求。这就是为什么当它使用 POST 方法获取请求时。它给出了错误方法不允许。 在你的views.py中为这个url创建一个视图并定义get和post方法。

    【讨论】:

    • 感谢您的帮助,它真的帮助我了解了我需要做什么!
    【解决方案2】:

    检查您的 urls.py 文件是否包含类似

    的内容
    from django.conf.urls import patterns, url
    
    urlpatterns = patterns('',
        url(r'^submit/$', 'yourapp.views.submit'),
    )
    

    datepicker 与问题无关。很可能您发布到另一个视图。检查所有 url 和视图名称。

    【讨论】:

      【解决方案3】:

      您没有映射到提交 URL 的视图。您在 /submit 下的唯一 URL 是 ListView。

      【讨论】:

        【解决方案4】:

        按照建议创建视图而不使用 ListView 解决了该问题。

        更新提交views.py

        from django.shortcuts import render
        from asset_db.models import Profiles
        
        
        def submit(request):
            profiles = Profiles.objects.order_by('-id')
            context = {'profiles': profiles}
            return render(request, 'submit/submit.html', context)
        
        
        def success(request):
            profiles = Profiles.objects.order_by('-id')
            context = {'profiles': profiles}
            return render(request, 'submit/success.html', context)
        

        更新模板 submit.html

        {% extends 'website/header.html' %}
        {% block content %}
            <p><b>Submit Job</b></p>
            <form action="{% url 'success' %}" method="post">
            {% csrf_token %}
                <b>Select Asset to transcode</b>
                <p>Material ID:
                    <input type="text" name="material_id" size="30" value="" id="keyword"/>
                </p>
                <p>Profile:
                    <select name="workflow">
                        <option value="">Select a transcode Profile</option>
                        {%  for i in profiles %}
                            <option value="{{ i.name }}">{{ i.name }}</option>
                        {% endfor %}
                    </select>
                </p>
                <script>
                    $(function() {
                        $( "#start_datepicker" ).datepicker({
                            dateFormat: 'dd-mm-yy'
                        });
                    });
                </script>
                <p>License Start Date: <input type="text" id="start_datepicker" name="start_date"></p>
                <script>
                    $(function() {
                        $( "#end_datepicker" ).datepicker({
                            dateFormat: 'dd-mm-yy'
                        });
                    });
                </script>
                <p>License End Date: <input type="text" id="end_datepicker" name="end_date"></p>
                <p>
                    <input type="submit" name="submit" />
                </p>
            </form>
        {% endblock %}
        

        网络服务器结果:

        [09/Feb/2017 08:55:22] "GET /submit/ HTTP/1.1" 200 3300
        [09/Feb/2017 08:55:29] "POST /submit/success/ HTTP/1.1" 200 2043
        

        我使用Django Tutorial part 3 来帮助创建上下文。感谢您为我指明正确的方向!

        【讨论】:

          猜你喜欢
          • 2021-04-14
          • 2013-11-19
          • 1970-01-01
          • 2018-01-01
          • 2015-11-28
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 2019-08-30
          相关资源
          最近更新 更多