我的代码有什么问题,用户输入不会进入django数据库?

时间:2017-08-09 03:10:06

标签: python html django sqlite jinja2

我想要的是用户输入在用户点击Submit后进入数据库,但我在浏览器中收到错误消息:

RuntimeError at /content
You called this URL via POST, but the URL doesn't end in a slash and 
you have APPEND_SLASH set. 
Django can't redirect to the slash URL while maintaining POST data. 
Change your form to point to 127.0.0.1:8000/content/ (note the trailing 
slash), or set APPEND_SLASH=False in your Django settings.

我知道我非常接近实现这一点,我只是想知道我错过了什么或者我搞砸了。

这是views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Email
from django.core.exceptions import *

def index(request):
    return render(request, 'personal/home.html')

def contact(request):
    return render(request, 'personal/basic.html',{'content':['If you would like more information, leave your email.']})

def search(request):
    if request.method == 'POST':
        search_id = request.POST.get(name = search_id)
        try:
            user = Email.objects.get(name=search_id)
            # do something with user
            html = ("<H1>%s</H1>", user)
            return HttpResponse(html)
        except Email.DoesNotExist:
            return HttpResponse("no such user")
        else:
            return render(request, 'basic.html')

这是urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^content/', views.contact, name='content'),
]

这是basic.html

{% extends "personal/header.html" %}

{% block content %}
<style type="text/css">
    h1 {
        color: #2e6da4;
        font-family: Chalkboard;
    }

    .text {
        text-align: center;
    }
</style>

    {% for c in content %}
        <h1>{{c}}</h1>
    {% endfor %}

    <div class="form-group">
        <form method="POST" action="/content">
            {% csrf_token %}
            <input type="text" name="textfield">

            <button type="submit">Submit</button>
        </form>
        </div>
{% endblock %}

3 个答案:

答案 0 :(得分:0)

这是因为您在网址POST而不是/content {{}}重新{{}}了数据。使用{% url %}模板标记更改为/content/或更改为<form method="POST" action="/content/">

答案 1 :(得分:0)

Django有一项功能可以自动将 / content 等网址重定向到 / content / 。但是,当您使用POST HTTP方法时,此功能不起作用。 Django试图告诉你它试图进行这种重定向,但它不能因为你使用的是POST。

要更正此问题,表单标记中的操作必须与urls.py中的网址相匹配。

因此,您可以尝试更改HTML:

public static void Main(string[] args) {
   const int serviceId = 128;
   .
   .
   .
   ListenForSearchQueries(resourceId).Wait();
   Console.ReadKey();
}

<form method="POST" action="/content">

或者,您可以更改您的网址:

<form method="POST" action="/content/">

删除斜杠,并添加行尾regex:

url(r'^content/', views.contact, name='content'),

只要它们匹配,它们都可以工作。

答案 2 :(得分:0)

据我所知,你期望的行为是这样的:

  1. 用户在浏览器中访问/内容
  2. 您的Django服务器通过呈现basic.html
  3. 进行响应
  4. 用户在表单中输入电子邮件并提交
  5. 表单发布到/含有一些数据
  6. 服务器使用给定的电子邮件创建Email对象并将其存储在数据库中
  7. 至于错误,请查看Django文档中的这些信息:

      

    APPEND_SLASH

         

    默认值:True

         

    如果设置为True,如果请求URL与URLconf中的任何模式都不匹配且它不以斜杠结尾,则会向相同的URL发出HTTP重定向并附加斜杠。请注意,重定向可能会导致POST请求中提交的任何数据丢失。

    它告诉您在表单操作的末尾添加/,例如action="/content/",因为在urls.py中指定了url(r'^content/'...

    或者,如果你不想担心所有这些&#34;尾随斜线&#34;业务,进入您的settings.py并添加

    APPEND_SLASH = False
    

    然而,还有更多工作要做。目前,您的def contact函数仅处理GET请求,并且在POST一些表单数据时无法做什么。让我们解决这个问题:

    def contact(request):
        if request.method == "GET":
            return render(request, 'personal/basic.html', {'content': ['If you would like more information, leave your email.']})
    
        elif request.method == "POST":  
            email = Email(name=request.POST.get("textfield"))
            email.save()
            return render(request, 'basic.html')