【问题标题】:How do I bind queried data to a Django form in a view and render it in template?如何将查询到的数据绑定到视图中的 Django 表单并在模板中呈现?
【发布时间】:2012-11-28 14:23:05
【问题描述】:

这让我发疯了,我无法让它工作。这是一个简单的场景:我想向用户展示我从数据库中提取的动态生成的用户列表,以便用户可以从 ChoiceField 中选择一个用户(呈现为 HTML 选择)并单击“获取数据”按钮。

我不想在表单中创建用户列表,因为新用户会一直出现。我想在我的视图中查询用户并将该用户列表绑定到表单,以便我始终可以呈现最新的用户列表。所以这是我的表格:

class ViewUsersForm(forms.Form):
  user_choice = forms.ChoiceField()

这是我的观点:

from django.contrib.auth.models import User
from mystuff.forms import ViewUsersForm

def site_admin_view_user_groups_page(request):
  if request.method == 'POST':
    <...handling POST for this question is unimportant...>
  else:
    users = User.objects.all()
    data = {'user_choice': users}
    form = ViewUsersForm(data) # binding the list of users here

  variables = RequestContext(request, {'form': form,})
  return render_to_response('school/admin/view_user_groups_page.html', variables)

最后,这是我要渲染的模板:

<form action="/site/viewusers/" method="post">{% csrf_token %}
  {{ form.user_choice }}
  <button type="submit" name="getDataButton">Get Data</button>
</form>

因此,当模板呈现绑定表单(form = ViewUsersForm(data))时,ChoiceField 为空。如何获取 ChoiceField 中的数据以在我的 HTML 中呈现???我在这里错过了什么真正简单的事情?还是我的做法完全错误?

【问题讨论】:

    标签: data-binding django-forms django-views


    【解决方案1】:

    ChoiceField 采用“2 元组的可迭代(例如,列表或元组)作为该字段的选择。”因此,您需要将您的选择设置为 ((value1, 'name1'),(value2, 'name2'),()) https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ChoiceField

    您还可以使用 ModelChoiceField 按原样使用您的查询集 https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ModelChoiceField

    【讨论】:

    • 谢谢,埃斯特班。您的第一个建议不起作用,因为我每次都需要动态查询。但是,ModelChoiceField 成功了,因为我可以将查询传递进去。耶!所以这是另一个问题。我返回的用户列表以用户名呈现。如何将 ChoiceField 呈现为“姓氏,名字”?我应该遍历模板中的 form.user_choice 以提取名字和姓氏吗?
    • 我相信为标签调用了 unicode 方法。如果您还没有指定一个,您可以将 unicode 方法添加到您的模型中,以便它返回 '%s, %s' % (self.last_name, self.first_name)。如果这不起作用,您可以随时覆盖表单字段:stackoverflow.com/questions/3167824/…
    • 感谢您的建议。我构建了一个自定义ModelChoiceField,效果很好。
    猜你喜欢
    • 2017-05-22
    • 2018-03-18
    • 2019-01-24
    • 2021-08-10
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多