2011-06-25 82 views
1

我想寫一些優雅的地方,我不依賴於我的代碼中的請求對象。所有的例子都使用: (r'^ hello /(?p。*)$','foobar.views.hello') ,但它似乎並不像你可以很容易地發佈到一個URL形成。有沒有辦法讓這個URL迴應.... /你好?name = smith有沒有辦法在urls.py中用django捕獲URL參數?

回答

3

絕對。如果你的URL映射到一個功能,在這種情況下foobar.views.hello,則該功能可能是這樣的一個GET請求:

def hello(request): 
    if request.method == "GET": 
     name_detail = request.GET.get("name", None) 

     if name_detail: 
      # got details 
     else: 
      # error handling if required. 

數據的編碼形式,即POST參數,如果是從request.POST您HTTP POST 。

如果您想在POST請求上查詢參數,也可以自己構造這些參數。只是這樣做:

PARAMS = dict() 
raw_qs = request.META.get('QUERY_STRING', '') # this will be the raw query string 
if raw_qs: 
    for line in raw_qs.split("&"): 
     key,arg = line.split("=") 
     PARAMS[key] = arg 

27:11非POST請求的形式編碼的參數,這樣做:

FORM_PARAMS = QueryDict(request.raw_post_data) 

但是,如果你想使用形式Django的,你一定要看看在django.forms。整個表格庫通常會讓你的生活更輕鬆;我從來沒有用Django手工編寫html表單,因爲Django的這一部分將所有工作都從中解放出來。作爲一個快速的總結,你這樣做:

forms.py

class FooForm(forms.Form): 
    name = fields.CharField(max_length=200) 
    # other properties 

,甚至這樣的:

class FooForm(forms.ModelForm): 

    class Meta: 
     model = model_name 

然後在你的要求,你可以通過一個形式出來的模板:

def pagewithforminit(request): 
    myform = FooForm() 
    return render_to_response('sometemplate.html', {'nameintemplate': myform}, 
            context_instance=RequestContext(request)) 

而在接收它的視圖中:

def pagepostingto(request): 
    myform = FooForm(request.POST) 

    if myform.is_valid(): # check the fields for you: 
     # do something with results. if a model form, this: 
     myform.save() 
     # creates a model for you. 

另請參見model forms。總之,我強烈建議django.forms。

0

您無法在URL模式中捕獲GET參數。正如你可以看到django.core.handlers.base.BaseHandler.get_response,只有在request.path_info結束的URL的一部分是用來解決一個URL:

callback, callback_args, callback_kwargs = resolver.resolve(
     request.path_info) 

request.path_info不包含GET參數。爲了處理這些,請參閱Ninefingers的回答。

相關問題