2014-06-19 32 views
0

我对Django非常陌生,试图从用户从索引页上的下拉菜单中选择值,并将其用于doclisting页面。我试图在doclistings页面上打印该值,但似乎没有打印任何内容。我不确定这是否可行。任何帮助将非常感激。Django 1.6:将一个模板的下拉值传递给另一个

这里是指数模板在那里我已经下拉形式

<div class="signup"> 
      <div class="form-group"> 
      <form action="/doclistings/" method="post" >{% csrf_token %} 
      <select class="form-control" id="s1" name="selection"> 
       <option><b>Find a Doctor...</b></option> 
       {% for value, text in form.selection.field.choices %} 
       <option value="{{ value }}">{{ text }}</option> 
       {% endfor %} 
      </select> 
<button class="btn btn-primary" type="submit" name="submit" id="ss-submit">Find Doctors</button> 

这里doclisting这里我想从选择

<h2>{{selection}}</h2> 

这里打印量模板是索引方法views.py

def index(request): 
    d = getVariables(request,dictionary={'page_name': "Home"}) 
    if request.method == "POST": 
     form = DropdownSelectionForm(request.POST) 

     if form.is_valid(): 
      selection = form.cleaned_data['selection'] 

      return HttpResponseRedirect('/doclistings', 'selection') 
    else: 
     form = DropdownSelectionForm() 

    return render(request, 'meddy1/index.html', {'form': form}) 

这里是在views.py中的文档化方法

def doclistings(request): 
    d = getVariables(request) 
    doctors = Doctor.objects.all().order_by('-likes') 
    paginator = Paginator(doctors, 20) #Show 20 doctors per page 
    page = page = request.GET.get('page') 
    try: 
     doctors = paginator.page(page) 
    except PageNotAnInteger: 
     doctors = paginator.page(1) 
    except EmptyPage: 
     doctors = paginator.page(paginator.num_pages) 
    d['doctors'] = doctors 
    d['paginator'] = paginator 

    return render_to_response('meddy1/doclistings.html',d) 

forms.py

MY_CHOICES = (
    ('Dermatologist', 'Dermatologist'), 
    ('Dentist', 'Dentist'), 
    ('Opthalmologist', 'Opthalmologist'), 
) 

class DropdownSelectionForm(forms.Form): 
    selection = forms.ChoiceField(choices=MY_CHOICES, widget = forms.Select) 

urls.py

url(r'^index/$', views.index, name='index'), 
url(r'^doclistings/$', views.doclistings, name='doclistings'), 
+0

你能告诉我的urls.py文件,并DropdownSelectionForm模式? – dhana

+0

我已经添加了urls.py和表格 –

+0

,但是您将'selection.save()'保存到数据库中。什么是型号名称。 – dhana

回答

2

如果你还没有模型,你可以做到这一点使用Django会议,

假设你想要数据库(Django还提供基于文件的会话和基于缓存的会话):

Open settings.py and find MIDDLEWARE_CLASSES. Add 'django.contrib.sessions.middleware.SessionMiddleware' to the list. 
Find INSTALLED_APPS in the same file and add 'django.contrib.sessions' there. 
Run manage.py syncdb from the command line. 

初始设置后,您可以在视图中使用request.session在请求之间存储信息。

def index(request): 
    d = getVariables(request,dictionary={'page_name': "Home"}) 
    if request.method == "POST": 
     form = DropdownSelectionForm(request.POST) 

     if form.is_valid(): 
      selection = form.cleaned_data['selection'] 
      request.session["selection"] = request.POST['selection'] 

      return HttpResponseRedirect('/doclistings') 
    else: 
     form = DropdownSelectionForm() 

    return render(request, 'meddy1/index.html', {'form': form}) 

在查看文档列表,

def doclistings(request): 
    d = getVariables(request) 
    doctors = Doctor.objects.all().order_by('-likes') 
    paginator = Paginator(doctors, 20) #Show 20 doctors per page 
    page = page = request.GET.get('page') 
    print request.session["selection"] 
    try: 
     doctors = paginator.page(page) 
    except PageNotAnInteger: 
     doctors = paginator.page(1) 
    except EmptyPage: 
     doctors = paginator.page(paginator.num_pages) 
    d['doctors'] = doctors 
    d['paginator'] = paginator 

    return render_to_response('meddy1/doclistings.html',d) 

对于其他的东西,你可以用的request.session对象确实看到了documentation

+0

我在线打印request.session得到keyerror选择[“选择”] –

+0

尝试打印这种方式,'print request.session.get(“selection”,None)' – dhana

+0

这会给我一个没有定义的错误。我在视图中做了一些更改以打印出选择值。但它打印的价值是“无”。所以它不会保存下拉菜单中的值。任何想法为什么它不存储? –

2

首先,你正在做一些硬/错的方式。

  • 不要在模板中自己渲染字段Django forms can render the widgets,使用{{form.as_p}}
  • 您的表单的方法不应该是POST,它在db中更改时使用。你应该使用GET
  • 不要在重定向等硬编码的URL解耦它们。您正在使用named url patterns,因此请在您的代码reverse中获取网址的名称。
  • 使用命名组捕获您要重定向到的URL的参数,例如: url(r'^doclistings/(?P<group_name>\w+)/$', views.doclistings, name='doclistings'),您的函数也将获得group_name参数(您应该将其添加到函数标志中)。另一个选择是将它作为GET参数/doclistings?group=xyz并在你的函数中使用request.GET来检查你是否有组,如果有,进一步过滤。

一些更挑剔,咨询:

  • indexdoclisting是功能,而不是方法。
  • 您应该使用通用的基于类的视图,如FormViewListView,它们会删除您在此处使用的样板。

HTH

+0

我的表单只适用于POST,我试着把GET并且我得到MultiValueDicketKey错误 –

相关问题