2017-02-26 7 views
0

タグから値を取得し、submitによって '/ value /'にリダイレクトする必要があります。フォームから値を取得し、Djangoの/ valueにリダイレクトする方法1.10

今私は取得しています:私は完全に何かが欠けている

'ApartmentForm' object has no attribute 'cleaned_data' 

views.py

def index(request): 
    context = {} 
    context['apartments'] = get_list_or_404(Apartment) 
    if request.method == 'POST': 
     form = ApartmentForm(request.POST or None) 
     context = {'form': form,} 
     id = form.cleaned_data.get('id', None) 
     return redirect(id) 
    else: 
     context['apartment_form'] = ApartmentForm 
     return render(request, 'main/main.html', context) 

テンプレート

<form action="/{{ apartment.id }}" method="post"> 
    {% csrf_token %} 
    <p><select size="10"> 
    <option disabled>Chose apartment</option> 
    {% for apartment in apartments %} 
     <option value="{{ apartment.id }}">{{ apartment.title }}</option> 
    {% endfor %} 
    </select></p> 
    <input type="submit" value="Chose"> 
</form> 

更新

class ApartmentForm(ModelForm): 
    class Meta: 
     model = Apartment 
     fields = ['title'] 

forms.py

おかげでダニエル! テンプレートでフォームを呼び出さないように失敗しました。私はそれを修正しましたが、まだNoneをURL(http://127.0.0.1:8000/None)に渡しています。理由を理解できません。

view.py

def index(request): 
    context = {} 
    context['apartments'] = get_list_or_404(Apartment) 
    if request.method == 'POST': 
     form = ApartmentForm(request.POST or None) 
     if form.is_valid(): 
      id = form.cleaned_data.get('id', None) 
      return redirect(id) 
    else: 
     context['apartment_form'] = ApartmentForm 
     return render(request, 'main/main.html', context) 

forms.py

APARTMENTS =() 
for apartment in Apartment.objects.all(): 
    APARTMENTS += ((apartment.id, apartment.title),) 

class ApartmentForm(Form): 
    apartment = ChoiceField(label='', widget=Select, choices=APARTMENTS) 

<form action="." method="post"> 
    {% csrf_token %} 
    {{ apartment_form }} 
<input type="submit" value="Chose"> 
+0

cleaned_dataにアクセスする前に、 'form.is_valid()'をチェックする必要があります。 –

+0

フォームアクションの値も意味をなさないことに注意してください。その時点ではapartment.idの値はありません。幸いにも、それは単にアクションを空にするので、あなたが望むものであるインデックスビューにサブミットします。 –

+0

@DanielRosemanありがとう、 'action ="。 "に変更し、' form.is_valid() 'を追加しましたが、ValueErrorは返されませんでした... トレースバックはLeeの答えより下です。 –

答えて

0

form.cleaned_dataテンプレートがform.is_valid()から来ているので、あなたは、このようなあなたのviews.py変更sould:

def index(request): 
    [...] 
     if request.method == 'POST': 
      form = ApartmentForm(request.POST or None) 
       if form.is_valid(): 
        [...] 
        id = form.cleaned_data.get('id', None) 
        return redirect(id) 
+0

私は次のようになっています: 'トレースバック(最新のコール最後): ファイル" /Users/leonidivanov/Develop/A3/Standart/venv/lib/python3.5/site-packages/django/core/handlers/ "exception.py"、39行目、内部 レスポンス= get_response(リクエスト) ファイル "/Users/leonidivanov/Develop/A3/Standart/venv/lib/python3.5/site-packages/django/core/handlers/base .py "、198行目、_get_response で"代わりにNoneが返されました。 " %(コールバック.__ module__、ビュー名) ValueError:ビューmain.views.indexがHttpResponseオブジェクトを返しませんでした。代わりにNoneを返す。 –

+0

Djangoの 'view'はHttpResponeオブジェクトを返すべきです。 しかし、 'None'を取得した場合、' id = form.cleaned_data.get( 'id'、None) 'のようになります。これは、あなたのフォームから 'id'という名前の入力値を取得しなかったことを意味します。 – Beomi

+0

ええ、問題は 'id = form.cleaned_data.get( 'apartment'、None)'でなければならないということでした。みんなありがとう! –

関連する問題