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