重定向后表单未在模板中呈现(django)

Posted

技术标签:

【中文标题】重定向后表单未在模板中呈现(django)【英文标题】:Form is not rendered in the template after redirection (django) 【发布时间】:2014-02-06 17:23:48 【问题描述】:

我有一个处理和打印表单的视图及其模板。该表单有一个 ChoiceField,它将模型列表作为选项。这是我的观点、模板和表格:

*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 时,我的表单是按原样打印的。

我不明白为什么重定向发生后数据没有在我的模板中呈现,但它们仍然正确显示在我的服务器日志中。

【问题讨论】:

【参考方案1】:

您应该像在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')

【讨论】:

这是错误的原因。但是,OP 应该在 POST 成功后重定向回索引,而不是通过 modelUpdate 显示模板。 啊,是的!这就是我在那里想念的!非常感谢您的帮助! @DanielRoseman,我不确定 OP 想要什么。如果重定向到索引,form 实例将不同。

以上是关于重定向后表单未在模板中呈现(django)的主要内容,如果未能解决你的问题,请参考以下文章

在Django中提交表单后停止页面重定向

防止 Django 模板表单中的重定向

Django之重定向

如何在 Django views.py 中使用 int: 参数呈现重定向 URL?

使用 Django CBV 模型重定向后的白色 HTML 页面

使用 Django 和 AllAuth 登录后不重定向到我自己的视图