从另一个下拉列表填充Django下拉列表 - Javascript

时间:2017-08-25 09:42:59

标签: javascript python django forms

我有一个Django + Python网站,用户可以请求访问数据库。因此,在这种形式下,用户可以选择这些选项。

环境:这是一个包含两个值的下拉列表:开发和生产
权限:这是另一个下拉列表,包含两个值:读取和读取/写入

我想要实现的目标是:

If Environment == Development
   AddToPermissionDropDownList: Database Owner
else
 Permission

因此,正如您所看到的,我想根据另一个下拉列表的选定值填充一个下拉列表。

我知道我需要使用JavaScript来实现这一点,但我仍然坚持如何去做。

这是我迄今为止所做的。

models.py

class NewAccessRequest(models.Model):
permission_needed = models.CharField(max_length=25,verbose_name='Permissions')

forms.py

class AccessRequestForm(ModelForm):
environment= forms.ChoiceField(choices=ENVIRONMENT_CHOICES,label="",initial='',widget=forms.Select(attrs={'id':'environment','onchange':'changePermissions()'}), required=True)
permission_needed = forms.ChoiceField(initial='',widget=forms.Select(), required=True)

access.html

<form>
{% csrf_token %}
   <label for="{{ form.environment.id_for_label }}">Environment:</label>
    <p>{{form.environment}}</p>
<script>
function changePermissions() {
var EnvChosen = document.getElementById("environment").value;
if (EnvChosen == "DEV") {
document.getElementById("id_business_reason").value = "This is a test"

        }
    }
    </script>
</form>

3 个答案:

答案 0 :(得分:0)

因为需要从后端的选项填充。 你可以调用ajax方法从dropdown-1的change事件中获取后端的数据,然后你必须使用从ajax的响应中获得的数据填充dropdown-2,你也必须从dropdown传递值 - 1请求。您可以使用get或post请求。如果是发布请求,您还需要传递csrf令牌

答案 1 :(得分:0)

这是我迄今为止所做的。我看到的唯一问题是。

1)在环境下拉列表中,我选择:DEV    1.1)DB OWNER被添加 2)现在将环境下拉列表更改为:PROD    2.1)添加DB READER 3)现在将环境下拉列表更改为:DEV    3.1)DB OWNER再次添加。

我知道我需要以某种方式清理下拉列表中的值,我还不知道要在哪里做什么代码。

<script>
function changePermissions() {
   var EnvChosen = document.getElementById("environment").value;
   var selectList = document.getElementById("id_permission_needed")

   if (EnvChosen == "DEV") {
        var option = document.createElement("OPTION");
        var txt = document.createTextNode("DB OWNER");
        option.appendChild(txt);
        selectList.insertBefore(option, selectList.lastChild);
       }
   if (EnvChosen == "PROD") {
         var option = document.createElement("OPTION");
         var txt = document.createTextNode("DB READER");
         option.appendChild(txt);
         selectList.insertBefore(option, selectList.lastChild);
              }
          }
    </script>

答案 2 :(得分:0)

这不完全符合您的要求,但可能会指向正确的方向:https://stackoverflow.com/a/44168506/5531588