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从当前实例设置初始下拉值?的主要内容,如果未能解决你的问题,请参考以下文章

sonata_type_collection :从当前实体实例设置默认字段值

表单初始化后Django设置字段值

如何在渲染django模板时动态设置表单选择字段的初始值

qt 部件设置默认值

在 django 模型中为 id 设置自动递增初始值

easyui combobox 设置值