如何获取带有表单的对象,然后使用url将其发送到下一个视图?

时间:2019-06-25 13:43:43

标签: django django-forms

我试图将通过 ModelChoiceField 获得的对象通过url和views参数发送到视图中,但我认为这不是正确的方法。我不知道我是否必须使用 POST GET 方法。

当我使用 GET 方法时,该对象显示在url中,但视图保持不变。 使用 POST 方法,django发送有关参数的错误消息。

编辑:我不记得确切的消息,暂时无法恢复,但是我记得他们说了类似Reverse for argument not found

我的表格

class IndividuForm(forms.Form):
    individu = forms.ModelChoiceField(queryset=Individu.objects.all()

这是带有表单的视图

def index(request):
    individu_form = IndividuForm(request.GET or None)
    if individu_form.is_valid():
        individu_id = individu_form.cleaned_data['individu'].id
        HttpResponseRedirect('%i/raison/' % individu_id)
    return render(request, 'derog_bv/index.html', {'individu_form':individu_form})

显示表单的模板

<form action="{% url 'index' <!-- Errors when I put parameters here --> %} method="<!-- GET or POST -->">
    {% csrf_token %}
    {{ form }}
<input type="submit">Suivant</input>
</form>

我要获取对象的视图

def raison(request, """ error with this parameter : individu_id"""):
    individu = get_object_or_404(Individu, pk=individu_id)

URLs

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:individu_id>/raison/', views.raison, name='raison'),
]

1 个答案:

答案 0 :(得分:0)

好,所以:

1 /您肯定要为表单使用GET方法(您不提交要处理的数据/服务器状态更改)

2 /我不知道为什么要向索引模板中的{% url %}标签传递参数(也不向FWIW传递参数)-您正在将表单提交给索引视图,不要期望任何其他参数。实际上,您可以删除HTML表单标签的action属性,因为您想要的是默认值(提交当前网址)。

3 /您的views.raison原型必须与url定义匹配,因此必须为:

def raison(request, individu_id):
    # code here

4 /在您的索引视图中:

HttpResponseRedirect('%i/raison/' % individu_id)

您想使用django.core.urlresolvers.reverse来构建网址:

from django.core.urlresolvers import reverse


def index(request):
   # code here
   if ...:
       next = reverse("raison", kwargs={"individu_id": individu_id}) 
       return HttpResponseRedirect(next)

或者-甚至更简单-只需使用the redirect shortcut

from django.shortcuts import redirect


def index(request):
   # code here
   if ...:
       return redirect("raison", individu_id=individu_id) 

您的代码可能还有其他问题,但是从您发布的信息来看,这些提示至少应该使您重回正轨。