Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的post表单处理更加灵活_Python_Django - Fatal编程技术网

Python 如何使我的post表单处理更加灵活

Python 如何使我的post表单处理更加灵活,python,django,Python,Django,我已经写了我希望是一个可重用的Django应用程序,但是在如何使post表单处理灵活方面我有一个难题。我的视图代码的简化版本如下所示: def do_form(request, entity_id, template_name, success_url): form = MyForm(request.POST or None) if request.method =='POST': if form.is_valid(): #do so

我已经写了我希望是一个可重用的Django应用程序,但是在如何使post表单处理灵活方面我有一个难题。我的视图代码的简化版本如下所示:

def do_form(request, entity_id, template_name, success_url):

    form = MyForm(request.POST or None)

    if request.method =='POST':
        if form.is_valid():

            #do some business logic

            return HttpResponseRedirect(finished_url)
    return render_to_response(template_name, 
                              {'form': form},
                             context_instance=RequestContext(request))
我遵循了James Bennets在《实用Django项目》一书中的建议,因此您现在可以在url配置中配置模板和成功url,例如,我的url配置可以如下所示:

urlpatterns = patterns('myapp.views',


          url(r'^do/(?P<entity_id>\d+)/$', 
          view = 'do_form',
          name = 'do_form_view',
          kwargs={'template_name':'form.html',
                    'success_url':'/finish/'},),

          url(r'^finish/$', 
          view = 'finish',
          name = 'finish_view')
)
urlpatterns=patterns('myapp.views',
url(r'^do/(?P\d+/$),
视图='do_form',
name='do_form_view',
kwargs={'template_name':'form.html',
'success_url':'/finish/'},),
url(r“^finish/$”,
视图='finish',
名称='finish_view')
)
<>这是非常好的,但是当我在我的现实世界应用程序中使用这个时,我发现自己处于某种工作流的中间状态,我希望成功的URL是类似于“代码> /继续//< /COD>”,问题是URL CONF中只能有一个硬编码的URL,每次我点击do_表单代码时,工作流id都会发生变化


有谁能提出一种方法来解决这个问题吗?

你可以用人们多年来“覆盖”Django基于函数的通用视图的方法来解决这个问题:只需将视图包装到另一个视图中:

def custom_do_form(request, entity_id, template_name, success_url):
    template_name = some_method_to_get_template()
    return do_form(request, entity_id, template_name, success_url)

您可以通过更改以下内容来实现此目的

do_form()
inviews.py中 将
返回HttpResponseRedirect
更改为

return HttpResponseRedirect('/continue/%s' %(workflowid))
url.py中,您可以

url(r'^continue/(?P<workflowid>\d+)/$', 
          view = 'continue',
          name = 'continue_view')

这边。。无论何时访问url
/continue/
,如果没有数字,workflowid将等于
None
。每隔一段时间,如果您确实附加了workflowid,例如
/continue/23/
,那么在
continue()
视图中,您可以通过变量
workflowid

访问该id。当您将假设的“灵活”成功url传递给视图时,该视图必须提供所需的标识符。因此,如果URL和视图不匹配,我们无法避免两者之间发生“违约”

因此,如果我们要有灵活的URL,就必须执行某种合同,如果我们通过URL的特殊语法这样做,就不会失去通用性:

  'finished_url':  '/finish/<workflow_id>/'
你会有

  return HttpResponseRedirect(finished_url.replace('<workflow_id>', WorkflowID))
返回HttpResponseRedirect(完成的url.replace(“”,WorkflowID))
这应该使事情保持合理的简单

在重用代码时,您必须记住,
是应用程序用来调用工作流id的任何东西,这就是为什么我使用一个复杂的字符串,例如
workflow\u id
,而不是
id
或者
$1


编辑:我本来打算为下一步添加代码(在finish参数中截取工作流ID),但我发现keithxm23比我更重要:-)

实现您要求的功能的一个快速方法是让两个URL指向同一个视图。你可以使用
url(r'^success/$,view='finish')
url(r'^failure/$,view='finish',)
并根据你的
dou表单
视图的“success”或“failure”给出你对每一个问题的回答。很抱歉,我的问题的格式去掉了一个关键部分,使我很难理解我的意思,我现在已经编辑过了是的,我想到了这一点,但是如果我想在其他情况下重用这个应用程序,在视图中使用工作流参数不允许我有太多的灵活性…只要你总是通过执行
workflowid=None
,为它赋值(在这种情况下为None),在某些情况下,您不必担心不提供workflowid。你所说的灵活性的障碍是什么?我不确定@keithxm23对我的问题的回答是否接近,但它没有给我所需要的灵活性
  return HttpResponseRedirect(finished_url)
  return HttpResponseRedirect(finished_url.replace('<workflow_id>', WorkflowID))