Django从当前实例设置初始下拉值?
Posted
技术标签:
【中文标题】Django从当前实例设置初始下拉值?【英文标题】:Django setting initial dropdown value from current instance? 【发布时间】:2020-11-14 18:02:06 【问题描述】:我正在尝试在下拉列表中设置初始选项,在配置文件编辑中选择Business
type。但我希望下拉列表已经选择了当前实例的选择。但我只是不知道如何在前端渲染它。我听说 jinja 模板提供了一个选择选项来执行此操作?
我将从我的应用程序中获取一个代码 sn-p,
def edit_profile(request):
request_user = request.user
# FOR SENDING USER TO SERVER
if request.method == 'POST':
template_name = 'business/profile_view.html'
first_name = request.POST['first_name']
business = request.POST.getlist('business_type', '')
if business == '':
pass
try:
user_obj = Account.objects.get(email=request.user)
""" Loop over business types and assign to user """
user_obj.business.clear()
for _business in business:
user_obj.business.add(_business)
return redirect('/auth/edit_profile/')
except Exception as e:
message = "message": "Profile edit ERROR"
return render(request, template_name, message)
# FOR SERVER TO USER
if request.method == 'GET':
template_name = 'business/profile_view.html'
context = dict()
user_obj = Account.objects.get(email=request.user)
context['business_type'] = user_obj.business
if request.path == '/auth/edit_profile/':
return render(request, template_name, context)
elif request.path == '/auth/edit_profile_edit/':
return render(request, 'business/profile_edit.html', context)
还有我的模板
<select class="selectpicker" name="business_type" multiple="multiple"title="Select a category">
% for business in business_types %
<option value=" business.id "> business.name </option>
% endfor %
</select>
【问题讨论】:
我认为您应该仔细检查上面代码中的缩进,其中一些似乎不正确。 啊,是的,来自reddit的问题,我在复制/粘贴时手动间隔了哈! 【参考方案1】:我建议您查看Django's forms system。它做了很多设置表单、呈现小部件甚至为您验证数据的工作。您还可以发送已填写当前实例的表单
【讨论】:
【参考方案2】:您可以将“选定”添加到您的视图上下文中:
context['selected'] = business # or however you are identifying the selected
然后在 html 中您可以使用 ifequal
语句添加选定的标签:
% for business in business_types %
<option % if ifequal business.name selected.name %selected% endif %
value=" business.id "> business.name </option>
% endfor %
或者如果上下文是一个列表,那么你可以使用% if business in selected_businesses %
% for business in business_types %
<option % if business in selected_businesses %selected% endif %
value=" business.id "> business.name </option>
% endfor %
【讨论】:
是的,它是一个列表。在我的Account
模型中,我有一个 m2m 到 Business
模型,这只是我的下拉菜单中包含业务类型的模型。我认为添加它会起作用。 context['selected'] = user_obj.business.name
selected_businesses
在模板中来自哪里?这是一个内置的 jinja 命名空间吗?
selected_businesses 只是一个示例变量名称,看起来您正在此处检索列表:business = request.POST.getlist('business_type', '')
,因此它可能类似于 selected_businesses = request.POST.getlist('business_type', '')
所以现在,在 GET 请求中,context['business_type'] = user_obj.business 也许我需要将其转换为列表,并获取值。因为该上下文必须提供多个值,例如。一个Account
可以选择成为多种业务类型。
对,您可能需要一个列表,因为您允许多项选择。以上是关于Django从当前实例设置初始下拉值?的主要内容,如果未能解决你的问题,请参考以下文章