2017-08-09 1 views
1

Tout ce que je veux est pour l'entrée de l'utilisateur d'entrer dans la base de données sur utilisateur en cliquant sur Submit mais je reçois une erreur dans mon navigateur qui dit:Quel est le problème avec mon code que l'entrée de l'utilisateur ne va pas dans la base de données django?

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. 

Je sais que je suis très proche de faire arriver, Je veux juste savoir ce qui me manque ou où j'ai foiré.

est ici 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') 

est ici 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'), 
] 

Voilà 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 %} 
+0

Si l'une des réponses ci-dessous vous a aidé à résoudre votre problème, veuillez le marquer comme accepté. C'est une bonne pratique dans StackOverflow :) –

+0

Si l'une des réponses ci-dessous vous a aidé à résoudre votre problème, veuillez le marquer comme accepté. C'est une bonne pratique dans StackOverflow :) –

+0

@nik_m Je vais les essayer dès que j'en aurai l'occasion, alors je l'accepterai si ça marche :). Merci de me le rappeler! – hop38

Répondre

0

Il est parce que vous êtes POST ing les données à l'adresse /content au lieu de /content/. Soit, passez à <form method="POST" action="/content/"> ou mieux passez à <form method="POST" action="{% url 'content' %}"> en utilisant la balise modèle {% url %}.

0

Django a une fonctionnalité qui peut rediriger automatiquement les URL telles que /contenu-/content/. Mais, cette fonctionnalité ne fonctionne pas lorsque vous utilisez la méthode HTTP POST. Django essaie de vous dire qu'il a essayé de faire cette redirection, mais il ne pouvait pas parce que vous utilisiez un POST. Pour corriger cela, l'action dans votre balisage de formulaire doit correspondre à l'url de votre URL.py.

Vous pouvez essayer de changer votre code HTML:

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

à

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

Ou, vous pouvez modifier vos urls:

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

en supprimant la barre oblique, et en ajoutant une fin de ligne regex:

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

L'un ou l'autre fonctionnera, tant qu'ils correspondent.

0

Si je comprends bien, votre comportement souhaité va comme ceci:

  1. utilisateur visite/contenu dans leur navigateur
  2. votre serveur Django répond en rendant basic.html
  3. l'utilisateur saisit son email dans le formulaire et soumet
  4. le formulaire poste à/contenu avec certaines données
  5. le serveur crée un objet Email avec l'email donné et le stocke dans la base de données

En ce qui concerne l'erreur, jetez un oeil à cette info des docs Django:

APPEND_SLASH

Par défaut: True

Quand il est réglé sur True, si le L'URL de requête ne correspond à aucun des modèles de l'URLconf et ne se termine pas par une barre oblique, une redirection HTTP est émise vers la même URL avec une barre oblique ajoutée. Notez que la redirection peut entraîner la perte de toutes les données soumises dans une demande POST.

Il vous dit d'ajouter un / à la fin de l'action des formes, comme celui-ci action="/content/" parce que dans votre urls.py que vous avez spécifié url(r'^content/'...

Ou, si vous ne voulez pas vous soucier de tout cela " slash » entreprise, allez dans votre settings.py et ajoutez

APPEND_SLASH = False 

Cependant, il y a plus à faire. Actuellement, votre fonction def contact ne gère que les requêtes GET et n'a aucune idée de ce qu'il faut faire lorsque vous POSTEZ des données de formulaire. Réparons ceci:

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