2016-11-11 68 views
0

我在使用Django快捷方式呈现页面时遇到了一些困难。我的工作流程非常简单:Django视图不能正确重定向

  1. 用户进入一个页面,在这里他们可以查看某些项目数据(detail_project)
  2. 如果他们想更新项目数据,他们应该点击一个按钮,将发送POST请求,加载update_project页面。此页面将加载当前的项目数据。
  3. 用户更新并提交新数据。提交后,它们返回到detail_project页面。

我的看法是这样的:

def update_project(request): 
    if request.method == 'POST': 
     if 'update_project_submit' in request.POST: 
      # updates project with form data and returns to detail project page 
      return redirect('detail_project', project_name=project_name) 
     else: 
      # loads project original data into the form 
    return render(request, 'project/update_project.html', context) 


def detail_project(request, project_name): 
    if request.method == 'POST':   
     if 'update_project' in request.POST: 
      return update_project(request) 
     else: 
      # does another stuff 
    else: 
     # shows project details 
     return render(request, 'project/detail_project.html', context)  

urls.py:

url(r'^project/update/$', views.update_project, name='update_project'), 
url(r'^project/details/(?P<project_name>[a-zA-Z][a-zA-Z0-9-_]+)/$', views.detail_project, name='detail_project'), 

而且update_project.html:

<form class="form-horizontal" role="form" action="" method="post"> 
    {% csrf_token %} 
    {% for field in form %} 

     <div class="form-group"> 
      <div class="col-sm-3"> 
       <label for="{{ field.id_for_label }}" class="control-label">{{ field.label }}</label> 
      </div> 

      <div class="col-sm-9"> 
       {{field}} 
      </div> 
      <div class="col-sm-12"> 
       {{ field.help_text }} 
      </div> 
     </div> 
     {{field.non_field_errors }} 
     {{field.errors}} 

    {% endfor %} 


    <button type="submit" name="update_project_submit" class="btn btn-primary">Submit</button> 

</form> 

[更新]

Forms.py

class UpdateProjectForm(forms.Form): 

    project_name_validator = RegexValidator(r'^[a-zA-Z][a-zA-Z0-9-_]{1,31}$', constants.PROJECT_NAME_INVALID) 
    project_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'required': 'true'}), validators=[project_name_validator]) 
    project_description = forms.CharField(required=True, widget=forms.Textarea(attrs={'style':'resize:none;', 'required': 'true'})) 
    project_expiration = forms.DateField(required=False, widget=forms.TextInput(attrs={'class':'datepicker'})) 

    def __init__(self, *args, **kwargs): 
     super(UpdateProjectForm, self).__init__(*args, **kwargs) 
     self.fields['project_name'].label = "Project Name:" 
     self.fields['project_description'].label = "Project Description:" 
     self.fields['project_expiration'].label = "Expiration Date:" 

的问题是,我不能更新我的项目。我的页面正确加载表单(update_project)和当前数据(步骤2),但是当我提交它时(单击提交按钮,我将被重定向到详细项目页面而不输入if 'update_project_submit' in request.POST:声明。也许我的工作流程是错误的。不能看着办吧。

我印我的请求,我真的cofirmed,当我提交表单,我收到一个POST请求detail_project。

有我丢失的东西?还是我我试图根据Django的逻辑做错事?

+0

你为什么不使用Django的形式和标准的配方? – e4c5

+0

@ e4c5,那么,我正在使用django表单。 “标准配方”是什么意思? – revy

+0

你知道,创建一个postdata为一个职位的表格,没有它获得,呈现相同的形式,如果无效等您的代码似乎并不遵循该模式 – e4c5

回答

0

使用

if request.POST.get('update_project_submit', False): 

代替

if 'update_project_submit' in request.POST: 
+0

我已经做了这件事,没有任何改变。 – revy

+0

表单不会发送'update_project_submit'作为后置字段。使用return HttpResponse(request.POST)进行检查。 – vikasmcajnu