【问题标题】:Django 1.6: Pass dropdown value from one template anotherDjango 1.6:从一个模板传递下拉值
【发布时间】:2014-06-19 14:42:03
【问题描述】:

我是 Django 的新手,我试图从索引页面的下拉菜单中获取用户选择的值,并在文档列表页面中使用它。我正在尝试在文档列表页面上打印该值,但它似乎没有打印任何内容。我不确定这是否可能。任何帮助将非常感激。

这是我的下拉表单的索引模板

<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中的index方法

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中的doclisting方法

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'),

【问题讨论】:

  • 你能给我看看 urls.py 文件和 DropdownSelectionForm 模型吗?
  • 我已经添加了 urls.py 和表单
  • 但是您正在将 selection.save() 的内容保存到数据库中。型号名称是什么。
  • 我实际上并没有将选择保存到我的数据库中。我不知道为什么我有它。我只是在尝试让它发挥作用。

标签: python django drop-down-menu views


【解决方案1】:

如果你还没有模型,你可以使用 django session 来实现,

假设您想要基于数据库的会话(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

【讨论】:

  • 我在行 print request.session["selection"] 得到 keyerror selection
  • 尝试以这种方式打印,print request.session.get("selection", None)
  • 这会给我一个没有定义的错误。我在视图中进行了一些更改以打印出选择值。但它打印的值是“无”。所以它不会从下拉菜单中保存值。知道为什么它不保存吗?
  • 把这个改成&lt;form action="/index/" method="post" &gt;
  • 成功了!!!我非常感谢你的巨大帮助和不断挑剔你的大脑。
【解决方案2】:

首先,您正在以艰难/错误的方式做一些事情。

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

还有一些吹毛求疵的建议:

  • indexdoclisting 是函数,而不是方法。
  • 您应该使用基于通用类的视图,例如 FormViewListView,这会删除您在此处使用的样板。

HTH

【讨论】:

  • 我的表单只能在 POST 上使用,我尝试使用 GET 并得到 MultiValueDicketKey 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多