2016-09-14 33 views
0

以下是我的模板的相關部分。我試圖將所選字段從下拉列表發送到我的表單。從視圖使用ModelChoiceField的Django窗體始終無效

<form action="character_chat" method="post"> 
    <select id="character_name"> 
     {% for character in characters %} 
     <option name={{character}}>{{character}}</option> 
     {% endfor %} 
    </select> 
    <input type="submit" value="Select"> 
</form> 

相關代碼:

def character_chat(request): 
    class CharacterForm(forms.Form): 
     character_name = forms.ModelChoiceField(queryset=Character.objects.all()) 

    if request.method == 'POST': 
     form = CharacterForm(request.POST) 
     if form.is_valid(): 
      print("Valid form!") 
      print(form.cleaned_data['character_name']) 

我從來沒有看到打印語句,如此看來形式最終總是無效。任何建議或意見將不勝感激!

回答

1

您應該在模板中使用{{ form.character_name }}。不需要創建一個html select元素,因爲Django免費提供這個功能。此外,Django實際上使用了HTML屬性name,而不是id。另外,如果你想要做像這樣不使用form從你的情況下,你<option>標籤看起來更象這樣:

<option value={{character.id}}>{{character}}</option> 

退房更多信息的文檔:https://docs.djangoproject.com/en/1.10/topics/forms/#rendering-fields-manually

更新因評論:

您需要將表單放入模板的上下文中,然後才能使用它。下面是從the Django form docs取一個真正適用的例子:

from django.shortcuts import render 
from django.http import HttpResponseRedirect 

from .forms import NameForm 

def get_name(request): 
    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = NameForm(request.POST) 
     # check whether it's valid: 
     if form.is_valid(): 
      # process the data in form.cleaned_data as required 
      # ... 
      # redirect to a new URL: 
      return HttpResponseRedirect('/thanks/') 

    # if a GET (or any other method) we'll create a blank form 
    else: 
     form = NameForm() 

    return render(request, 'name.html', {'form': form}) 

注意一下,如果請求方法是GET,他們提供與模板的要求,並把form上下文字典裏面?這也是你需要做的:

def character_chat(request): 
    class CharacterForm(forms.Form): 
     character_name = forms.ModelChoiceField(queryset=Character.objects.all()) 

    if request.method == 'POST': 
     form = CharacterForm(request.POST) 
     if form.is_valid(): 
      print("Valid form!") 
      print(form.cleaned_data['character_name']) 
      # now you should redirect 
    else: # GET request method 
     form = CharacterForm() 
     return render(request, 'NAME OF YOUR TEMPLATE HERE', {'form': form}) 
+0

我刪除了選擇元素,我試圖把以下內容從文檔複製,但我看不到下拉字段。 '

{{ form.character_name }}
'這是不正確的? – user2424607

+0

你能爲你的character_chat視圖顯示完整的代碼嗎?你把形式放到了上下文中嗎? – denvaar

+0

這是character_chat視圖的完整代碼,除了導入。我認爲我沒有做過任何與情境有關的事情。 – user2424607