0

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):
    ....

如何保持这个逻辑分开但使用相同的渲染调用?

另外,假设我需要用另一个额外的变量来第三次渲染这个,我应该如何解释呢?

4

1 回答 1

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)
于 2014-09-12T07:29:26.797 回答