2017-06-06 54 views
1

我想创建一个“添加用户”功能,它只会增加你从下拉作为连接选择的用户。我使用ModelChoiceField从Django的形式,这样我可以从下拉我的用户模型得到的现有用户。Django表单 - 渲染形式和重定向

forms.py

from django import forms 
from django.contrib.auth.models import User 


class NetworkForm(forms.Form): 
    user_id = forms.ModelChoiceField(queryset=User.objects.all(), label='', 
             widget=forms.Select(attrs={'class': 'all_users'})) 

views.py

​​

现在我只是打印形式看到输出

@login_required 
def add_user(request): 
    form = NetworkForm() 
    if request.method == 'POST': 
     form = NetworkForm(request.POST) 
     if form.is_valid(): 
      print form 
      return redirect(request.META['HTTP_REFERER']) 

    errors = form.errors or None 

    return render(request, 'chat/index.html', { 
     'form': form, 
     'errors': errors, 
    }) 

的index.html

<div class="row"> 
 
<form action="{% url 'chat:add_user' %}" method="post"> 
 
{% csrf_token %} 
 
{{ form.as_p }} 
 
<button class="btn btn-warning" value="{{ user_id }}" style="float: left;">Submit</button> 
 
</form> 
 
</div>

urls.py

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^add_user/$', views.add_user, name='add_user'),] 

它被当前呈现的方式是:我有我的主索引页面,在这里我看不到任何下拉,即 enter image description here

当我点击提交按钮,它让我感动到指数/ ADD_USER,在那里我得到用户下拉(带有警告“这个字段是必须的)和重新提交按钮。 enter image description here

最后,当我在这个新页面中选择一个用户并点击提交时,最后打印出最终我想要的表格。 enter image description here

我想要什么,有索引页面本身下拉的完整形式,并在我提交表单时保留在那里。我便会钩住,以显示用户,他们补充说,形式本身下方的用户(“打印”仅仅是用于调试的目的 - 不是一个好办法,我虽然听说过)。 我明白POST请求将不得不去ADD_USER页面,我也可以把从后面。过去6个小时我尝试了各种替代方法,但没有任何工作。为长期的道歉,尽可能地提供信息。非常感谢你们。你太棒了。

编辑 人员已绘制在索引页的形式(建议从@法齐尔 - 扎伊德),但问题依然存在,如只有“提交”按钮,指数出现开始,除非当我点击提交之后,出现下拉并提交。再次点击第二次,表单被提交。

编辑-2 我想到:

<form action="{% url 'chat:index' %}" method="post">{% csrf_token %} 
{{ form.as_p }} 
    <button class="btn btn-warning" value="{{ user_id }}" style="float: left;">Submit</button> 
</form> 

这可能是问题的所在,按照目前的逻辑,除非用户采取形式的行动,即,点击按钮{{form.as_p }}不会出现。然后我想:

{{ form.as_p }} 
<form action="{% url 'chat:index' %}" method="post">{% csrf_token %} 
    <button class="btn btn-warning" value="{{ user_id }}" style="float: left;">Submit</button> 
</form> 

依然不工作。 POST请求不会发送任何数据(可以理解)。

回答

1

解决方案: 当页面使用GET称为在一审中,表单无效,因为它寻求一个POST方法。因此,所有的方法需要改变到POST在视图中,即

@login_required 
def index(request): 
    user_list = User.objects.exclude(username=request.user) 
    form = NetworkForm() 
    if request.method == 'POST': 
     form = NetworkForm(request.POST) 
     if form.is_valid(): 
      print form.data 
      return redirect(request.META['HTTP_REFERER']) 

    return render(request, 'chat/index.html', { 
     'user_list': user_list, 
     'form': form, 
    }) 

早些时候,指数使用GET来呈现数据到索引页,并且使用POST使用的形式。现在,一切正常。 特嚷出到@fazil-zaid用于既然你提到包含在索引视图自身的一切,而不是让对形式的单独视图抬头。您的代码在这里指出除了Stack之外。

+0

@ fazil-zaid不确定我是否将答案标记为答案或您的答案?你的确是一个大指针。你似乎是一个经验丰富的堆垛机,告诉我什么是准则。 – Manganese

+0

由于缺乏来自fazil的回复,我会让我的答案成为答案,建议用户一起看看fazil和我的两个组合,然后作出最终答案。 – Manganese

1

如果您希望表单位于索引页中,那么您可以将其包含在索引视图中。

def index(request): 
    if request.method == 'POST': 
     form = NetworkForm(request.POST) 
     if form.is_valid(): 
      #do what you wanna do 
      #with the form data. 
    else: 
     form = NetworkForm() 
    render(request, 'chat/index.html', { 'form': form}) 

在模板中,

<div class="row"> 
<form action="" method="post"> 
{% csrf_token %} 
{{ form.as_p }} 
<button class="btn btn-warning" value="{{ user_id }}" style="float: left;">Submit</button> 
</form> 
</div> 

你是不是渲染另一个模板,但相同的是index.html,。那么,多重视图就是多余的。索引页面可以包含表单并呈现它自己。据我所知,不需要重定向。

没有必要ADD_USER观点,如果你显示的索引页本身的形式。

对于您的问题,请尝试更改表单域,也许像这样的“类”属性,

class NetworkForm(forms.Form): 
    user_id = forms.ModelChoiceField(queryset=User.objects.all(), widget=forms.Select(attrs={'class': 'form-control'})) 
+0

感谢的人。是的,这是可以实现的,我是这样做的。 现在正在发生的事情是:1。 索引页只显示提交按钮。 2.点击提交,页面保持不变,但现在下拉菜单和提交按钮一起出现。 3.再次点击提交,然后只传输表格数据。 如何从图片中删除第1步是最终的问题。 _ + 1提示,对消除更新的附加url._ – Manganese

+0

答案 – zaidfazil

+0

改变了类按您的建议,而不是工作仍在。 我添加了前面的类,即'all_users'只是为了获得适当的CSS完成表单元素。 – Manganese