我正在尝试写一些优雅的东西,我不依赖于代码中的Request对象。所有示例都使用: (r'^ hello /(?P。*)$','foobar.views.hello') 但似乎你不能轻易地使用表单发布到这样的URL。有没有办法让该URL响应.... / hello?name = smith
答案 0 :(得分: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.
如果您从request.POST
发送HTTP POST,则可以使用编码形式的数据,即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
同样,对于非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。
答案 1 :(得分:0)
您无法在网址格式中捕获GET参数。正如您在django.core.handlers.base.BaseHandler.get_response
中所看到的,只有request.path_info
中以URL结尾的部分用于解析网址:
callback, callback_args, callback_kwargs = resolver.resolve(
request.path_info)
request.path_info
不包含GET参数。处理这些问题,请参阅Ninefingers的答案。