2016-09-04 2 views
0

Это мой первый реальный проект в Django, и я своего рода нуб здесь :))Не можете разместить форму в Django

В моей странице индекса Мне нужна информация от пользователя, а затем отправить его на другой вид ,

здесь что я нашел:

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

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

Главная страница:

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

Модель:

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

Я использую последнюю стабильную версию Django в это время (v1.10)

+0

Откуда возникает переменная 'download_link' в шаблоне? – ozgur

+0

@ozgur Он исходит из текстового поля –

+0

Вы ищете 'download_id' в URL-адресе, но вместо этого вы отправляете' download_link'. – ozgur

ответ

0

Когда вы смотрите на исходный код есть что-нибудь после пути /download/? Если download_link не передан в context, это не значит, что атрибут вашей формы action. Вы пытаетесь получить его значение в форме, но html генерируется при загрузке страницы, прежде чем пользователь сможет ее ввести.

Чтобы сделать что-то с помощью ввода, которое вы получите от формы, вам необходимо передать его в view через GET или POST. Только GET просит добавить аргументы в url, и форма позаботится об этом - вам не нужно указывать его в action.

В вашем случае вы могли бы сделать что-то вроде этого:

вид:

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

шаблона:

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

Кроме того, в функции view вы, вероятно, следует подумать способа проверки, если Download экземпляр с эти данные существуют и при создании нового экземпляра передают информацию для других полей тоже.

Изменить ваш progress адрес на url(r'^progress$', views.progress, name='progress') (без обратной черты!). Таким образом, URL-адрес должен быть разрешимым, и функция view должна иметь возможность получать данные POST. Отсюда вы можете продолжить модификацию, чтобы получить желаемый результат.

Существует много информации о формах в документах Django.Вы должны пройти через это, чтобы лучше понять предмет - https://docs.djangoproject.com/en/1.10/topics/forms/ и https://docs.djangoproject.com/en/1.10/ref/forms/

+0

Это не сработало, и я добавляю 'urls.py' к вопросу. –

Смежные вопросы