2014-01-17 124 views
1

我有一個處理和打印表單的視圖及其模板。該表單有一個ChoiceField,它將模型列表作爲選項。這是我的看法,模板和表單:表單在重定向後不在模板中呈現(django)

*views.py* 
def index(request): 
    form = dbForm() 
    print "form is: ", form 
    return render(request, 'Directories/index.html', {'form':form}) 

*index.html* 
<div id="content" align="center">     
<form action="" method="get"> {% csrf_token %} 
    {{form.as_p}} 
    <input type="submit" value="Edit" name="_add" /> 
</form> 

*forms.py* 
model_classes = [] 

class dbForm(forms.Form): 
    model_classes_field = forms.ChoiceField(choices=models()) 

def models(): 
    apps = get_app('Directories') 
    for model in get_models(apps): 
     model_classes.append((model._meta.verbose_name, model._meta.db_table),) 
    return model_classes 

提交發送到另一個視圖,其中一個的ModelForm顯示模型的字段和每個字段的提交預計數據模型的選擇。然後將提交的數據存儲在數據庫中,並將用戶重定向回索引以從頭開始重新開始。下面是這個視圖,模板和表單:

*views.py* 
def modelUpdate(request): 
    if 'update' in request.POST: # If the form has been submitted... 
     form_class = get_dynamic_form(request.GET['model_classes_field']) 
     form = form_class(request.POST)   
     if form.is_valid(): # All validation rules pass 
      row = form.save() #saves into database 
      return render(request, 'Directories/index.html') 
     else: 
      print "form errors: ", form.errors 
      return HttpResponse('ERROR -- Return to form submission') 


*create.html* 
<form action="" method="post"> {% csrf_token %} 
{% for f_name in field_names %} 
    {% if not forloop.first %}  
     {{f_name}}: <input id="edit-{{f_name}}" type="text" name={{f_name}} /><br /> 
    {% endif %} 
{% endfor %}<br /> 
<input type="submit" name="update" value="Update" /> 
<input type="reset" name="Clear" value="Clear" /> 
</form> 

*forms.py* 
#create a ModelForm using a dynamic model 
def get_dynamic_form(c_model): 
    model_class = get_model('Directories', c_model) 
    class ObjForm(forms.ModelForm): 
     class Meta: 
      model = model_class 
return ObjForm 

當表單被重定向回的index.html return render(request, 'Directories/index.html')後的數據被保存到數據庫中出現問題。結果是,index.html根本不顯示{{form.as_p}}。雖然當我檢查我的服務器(Apache)error.log中的print "form is: ", form時,我的表單在那裏打印,因爲它應該是。

我不明白爲什麼數據在重定向發生後不能在我的模板中呈現,但仍然能夠正確顯示在我的服務器日誌中。

回答

2

您應該像在index視圖中那樣將form實例傳遞到您的模板。您的代碼應更新爲

def modelUpdate(request): 
    if 'update' in request.POST: # If the form has been submitted... 
     form_class = get_dynamic_form(request.GET['model_classes_field']) 
     form = form_class(request.POST)   
     if form.is_valid(): # All validation rules pass 
      row = form.save() #saves into database 
      #------------------------------------------------v pass it to template 
      return render(request, 'Directories/index.html', {'form': form}) 
     else: 
      print "form errors: ", form.errors 
      return HttpResponse('ERROR -- Return to form submission') 
+1

這是錯誤的原因。但是,在POST成功後,OP應該重定向回索引,而不是通過modelUpdate顯示模板。 –

+0

啊是的!那是我在那裏失蹤的!非常感謝你的幫助! – per7inac1ousQ

+0

@DanielRoseman,我不確定OP想要什麼。如果重定向到索引,「form」實例將會不同。 – Rohan

相關問題