如何在2个单独的视图函数中使用相同的渲染? (django的)

时间:2014-09-11 18:33:10

标签: django python-3.x django-1.7

project_list()视图列出了已存在的所有项目,并为您提供了添加新项目的选项。 new_project()处理新项目的创建,然后重定向到project()视图或返回project_list(),包括表单,以便显示错误。

我一直在想我应该以某种方式使用相同的渲染功能。原因是大约一个星期后我没有意识到在form.is_valid() == False页面正确加载但未列出项目后(我忘记在第二个渲染中包含项目变量)。

@login_required
def project_list(request):
    projects = request.user.project_set.all()
    return render(request, 'projects/project_list.html', 
                  {'form': ProjectForm(),'projects': projects})

@login_required
def new_project(request):
    form = ProjectForm()
    if request.method == 'POST':
        form = ProjectForm(data=request.POST)
        if form.is_valid():
            project = form.save(commit=False)  #must specify user before commit
            project.owner = request.user
            project.save()
            return redirect(project)

    return render(request, 'projects/project_list.html', 
                  {"form": form, 'projects': request.user.project_set.all()})


def project(request, project_id):
    ....

如何将此逻辑分开但使用相同的渲染调用?

另外,假设我需要第三次使用另一个附加变量进行渲染,我应该如何解释?

1 个答案:

答案 0 :(得分:1)

基于类的视图是一个非常好的选择,但没有理由你不能做类似的事情;

def _render(request, form):
    return render(request, 'projects/project_list.html', 
                  {"form": form, 'projects': request.user.project_set.all()})

@login_required
def project_list(request):
    projects = request.user.project_set.all()
    form = ProjectForm()
    return _render(request, form)

@login_required
def new_project(request):
    form = ProjectForm()
    if request.method == 'POST':
        form = ProjectForm(data=request.POST)
        if form.is_valid():
            project = form.save(commit=False)  #must specify user before commit
            project.owner = request.user
            project.save()
            return redirect(project)

    return _render(request, form)