2017-02-26 5 views
0

태그에서 값을 가져 와서 제출하여 '/ 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) 

템플릿이처럼 views.py 변경 sould 있도록

<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가 반환 한 결과가 없음을 알게되었습니다 ... Traceback은 Lee의 답변 아래에 있습니다. –

답변

0

form.cleaned_dataform.is_valid()에서 온다 :

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__, view_name) 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)'이어야한다는 것입니다. 고마워요! –