2016-09-04 5 views
0

Il est mon premier vrai projet de Django et je suis un peu Noob ici :))Impossible de publier un formulaire dans Django

Dans ma page d'index j'ai besoin d'informations de l'utilisateur et afficher ensuite à une autre vue .

ici ce que j'ai trouvé:

NoReverseMatch at /download/ 
Reverse for 'progress' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['download/(?P<download_id>[0-9]+)/progress/$'] 

Voir Page:

class IndexView(generic.TemplateView): 
    model = Download 
    template_name = 'download/index.html' 

def progress(request, download_link): 
    download = models.Download(link=download_link, status = 0) 
    download.save() 
    return HttpResponseRedirect(reverse('download:detail', args=(download.id,))) 

page Index:

<form class="download" action="{% url 'download:progress' download_link %}" method="post"> 
    <input type="input" name="download_link" id="download_link" class="input" placeholder="Enter the URL:" value="{{download_link}}" required/> 
    <input type="submit" class="btn btn-primary" value="Download"> 
</form> 

Modèle:

class Download(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    link = models.CharField(max_length=3000) 
    status = models.IntegerField(default=-1) 

URL:

app_name = 'download' 
urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'), 
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'), 
    url(r'^(?P<download_id>[0-9]+)/progress/$', views.progress, name='progress'), 
] 

J'utilise le dernier Django stable à ce moment (v1.10)

+0

D'où vient la variable 'download_link' dans le modèle? – ozgur

+0

@ozgur Il provient de la zone de texte –

+0

Vous recherchez 'download_id' dans l'url mais vous envoyez' download_link' à la place. – ozgur

Répondre

0

Quand vous regardez le code source est là quelque chose après le chemin /download/? Si download_link n'est pas passé dans context cela ne signifie rien pour l'attribut action de votre formulaire. Vous essayez d'obtenir sa valeur dans le formulaire, mais le html est généré au chargement de la page, avant que l'utilisateur peut entrer. Pour faire quelque chose avec l'entrée que vous recevez d'un formulaire, vous devez le passer à une fonction view via la demande GET ou POST. Seules les requêtes GET ajoutent des arguments dans l'URL et le formulaire en prend soin - vous n'avez pas besoin de le spécifier dans action.

Dans votre cas, vous pouvez faire quelque chose comme ceci:

Vue:

def progress(request): 
    if request.method == 'POST': 
     download_link = request.POST['download_link'] 
     download = models.Download(link=download_link, status = 0) 
     download.save() 
     return HttpResponseRedirect(reverse('download:detail', args=(download.id,))) 

modèle:

<form class="download" action="{% url 'download:progress' %}" method="post"> 
    <input type="input" name="download_link" id="download_link" class="input" placeholder="Enter the URL:" required/> 
    <input type="submit" class="btn btn-primary" value="Download"> 
</form> 

En outre, dans la fonction view vous devriez probablement penser d'un moyen de vérifier si Download instance avec ces données existent et si vous créez une nouvelle instance passez également des informations pour les autres champs.

Remplacez votre progress par url(r'^progress$', views.progress, name='progress') (sans la barre oblique!). De cette façon, l'url devrait être résolvable et la fonction view devrait pouvoir recevoir les données POST. De là, vous pouvez continuer à modifier pour obtenir le résultat souhaité.

Il existe beaucoup d'informations sur les formulaires dans les documents de Django.Vous devriez passer par là pour mieux comprendre le sujet - https://docs.djangoproject.com/en/1.10/topics/forms/ et https://docs.djangoproject.com/en/1.10/ref/forms/

+0

Cela n'a pas fonctionné et j'ajoute le 'urls.py' à la question. –