0

这是我在 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/$']

查看页面:

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)

网址:

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)

4

1 回答 1

0

当您查看源代码时,/download/路径后面有什么吗?如果download_link未传入,context则对表单的action属性没有任何意义。您正在尝试在表单中获取它的值,但是在html用户输入之前,它是在页面加载时生成的。

为了对从表单收到的输入进行处理,您需要通过或请求将其传递给view函数。只有请求在 url 中添加参数并且表单会处理它 - 您无需在.GETPOSTGETaction

在您的情况下,您可以执行以下操作:

看法:

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/

于 2016-09-04T10:05:05.460 回答