2016-09-04 2 views
0

Es ist mein erstes richtiges Projekt in Django Sende und ich bin irgendwie Noob hier :))kann ein Formular nicht in Django

In meiner Index-Seite ich einige Informationen von dem Benutzer benötigen und es dann zu einem anderen Beitrag anzeigen .

hier, was ich gefunden:

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

anzeigen Seite:

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

Index Seite:

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

Modell:

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

URLs:

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

Ich bin letzte stabile Django zu diesem Zeitpunkt (v1.10)

+0

Woher kommt 'download_link' Variable in der Vorlage? – ozgur

+0

@ozgur Es kommt aus dem Textfeld –

+0

Sie suchen nach "download_id" in der URL, aber Sie senden stattdessen "download_link". – ozgur

Antwort

0

Wenn man sich mit Blick der Quellcode gibt es irgendwas nach dem Pfad? Wenn download_link in context nicht übergeben wird, bedeutet dies nichts für das Attribut action Ihres Formulars. Sie versuchen, seinen Wert im Formular zu erhalten, aber die html wird beim Laden der Seite generiert, bevor der Benutzer sie eingeben kann.

Um etwas mit Eingaben zu tun, die Sie von einem Formular erhalten, müssen Sie es an eine view Funktion über GET oder POST Anfrage übergeben. Nur GET Anfragen hinzufügen Argumente in der URL und das Formular kümmert sich darum - keine Notwendigkeit, Sie in action zu spezifizieren.

In Ihrem Fall, dass Sie etwas tun könnte:

Ansicht:

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

Vorlage:

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

Auch in der view Funktion sollten Sie wahrscheinlich denken einer Art zu prüfen, ob Download Instanz mit Diese Daten sind vorhanden. Wenn Sie eine neue Instanz erstellen, übergeben Sie auch Informationen für die anderen Felder.

Ändern Sie Ihre progress URL zu url(r'^progress$', views.progress, name='progress') (ohne den Schrägstrich!). Auf diese Weise sollte die URL auflösbar sein und die view Funktion kann POST Daten erhalten. Von hier aus können Sie weiterarbeiten, um das gewünschte Ergebnis zu erhalten.

Es gibt viele Informationen zu Formularen in Djangos Dokumenten.Sie sollten es durchgehen, um ein besseres Verständnis für das Thema zu bekommen - https://docs.djangoproject.com/en/1.10/topics/forms/ und https://docs.djangoproject.com/en/1.10/ref/forms/

+0

Es hat nicht funktioniert und ich füge die 'urls.py' zu der Frage hinzu. –

Verwandte Themen