django urls:具有默认值的可选参数始终为None

时间:2016-05-27 23:55:34

标签: python django url-routing

我有一个视图,用于在我的数据库中插入/更新一个名为BankAccounts的表...基本上如果info_id被传递给函数,则edit/update如果没有,它具有默认值它是一个insert操作

def bankcreate( requset , info_id = 0 ):

    print(' -----> id is ' + str(info_id))
    errors = []
    default = None

    if info_id is not None and info_id > 0 :
        try:
            default = BankAccounts.objects.get(id=info_id , user_id=requset.user.id)
        except BankAccounts.DoesNotExist :
            default = None


    if requset.POST :
        VALIDATIONRULES = {} # some rules here 
        data , errors = validation(requset , VALIDATIONRULES)

        if not errors :

            if info_id > 0 and  default is not None:
                ba = default
            else :
                ba = BankAccounts()

            ba.bank_accnumber = data['bank_accnumber']
            ba.bank_cartnumber = data['bank_cartnumber']
            ba.bank_shabanumber = data['bank_shabanumber']
            ba.bank_title  = data['bank_title']
            ba.user_id = requset.user.id
            ba.save()

            return redirect('account-bank')
        else:
            default = data

    return render(requset , 'account/bankcreate-form.html' ,
    {'default':default , 'errors':errors} )

所以当你看到该函数应该可以使用或不使用info_id访问 这是我的rules.py

urlpatterns = [
    url(r'^$', views.index , name='account-home'),
    url(r'^edit$', views.edit , name='account-edit'),
    url(r'^bankinfo', views.bankinfo , name='account-bank'),
    url(r'^bankcreate/(?:/(?P<info_id>[1-9]+)/)?', views.bankcreate , name='account-bankcreate'),

]

你可以看到我试图在最后一行写一个可选参数

url(r'^bankcreate/(?:/(?P<info_id>[1-9]+)/)?', views.bankcreate , name='account-bankcreate'),

但它没有&#39; work ...在函数的控制台上我得到info_id为None not event定义的默认值为0 ...我做错了什么?

这是我的示例网址

http://localhost:8000/account/bankcreate/1/

我已经尝试过两次

 url(r'^bankcreate/(?:/(?P<info_id>[1-9]+)/)?/$'

 url(r'^bankcreate/(?:/(?P<info_id>[1-9]+)/)?$'

但是我收到了这个错误

Page not found (404)
Request Method:     GET
Request URL:    http://localhost:8000/account/bankcreate/1/

Using the URLconf defined in paypal.urls, Django tried these URL patterns, in this order:

        ^$
        ^admin/
        ^account/ ^$ [name='account-home']
        ^account/ ^edit$ [name='account-edit']
        ^account/ ^email [name='account-email']
        ^account/ ^bankinfo [name='account-bank']
        ^account/ ^bankcreate/(?:/(?P<info_id>[1-9]+)/)?$ [name='account-bankcreate']
        ^account/ ^password [name='account-password']
        ^gateway/
        ^auth/

    The current URL, account/bankcreate/1/, didn't match any of these.

1 个答案:

答案 0 :(得分:1)

你的正则表达式中有一个额外的斜杠(第二个)。

更改

url(r'^bankcreate/(?:/(?P<info_id>[1-9]+)/)?$'

url(r'^bankcreate/(?:(?P<info_id>[1-9]+)/)?$'
相关问题