Django使用基于单选字段的模型数据自动填充整个表单

Django使用基于单选字段的模型数据自动填充整个表单,django,django-models,django-forms,Django,Django Models,Django Forms,我试图创建一个基于单个select字段填充所有字段的modelform。基本上,当用户从下拉列表中选择一个值时,它将根据数据库中的数据填充其余字段 型号.py: class Commands(models.Model): command_id = models.AutoField(primary_key=True) name = models.CharField(max_length=255) command_prefix = models.TextField()

我试图创建一个基于单个select字段填充所有字段的modelform。基本上,当用户从下拉列表中选择一个值时,它将根据数据库中的数据填充其余字段

型号.py

class Commands(models.Model):
    command_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    command_prefix = models.TextField()
    command = models.TextField()
    args = models.TextField()
    shell = models.TextField()
    role = models.ForeignKey('Roles', models.DO_NOTHING)
    os = models.ForeignKey('Operatingsystems', models.DO_NOTHING)
    job_type = models.ForeignKey('Jobtypes', models.DO_NOTHING)
    active = models.IntegerField()
@verified_email_required
def jobs(request):
    return render(request, 'backend/jobs.html', {'form': CommandsForm()})
class CommandsForm(Form):
    name = ModelChoiceField(queryset=Commands.objects.filter(active=1).values('name'))
    os = CharField(required=True, disabled=True)
    command_prefix = CharField(required=True, disabled=True)
    target = CharField(required=True)
    command = CharField(required=True, disabled=True)
    args = CharField(required=True, disabled=True)
    shell = CharField(required=True, disabled=True)
视图.py

class Commands(models.Model):
    command_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    command_prefix = models.TextField()
    command = models.TextField()
    args = models.TextField()
    shell = models.TextField()
    role = models.ForeignKey('Roles', models.DO_NOTHING)
    os = models.ForeignKey('Operatingsystems', models.DO_NOTHING)
    job_type = models.ForeignKey('Jobtypes', models.DO_NOTHING)
    active = models.IntegerField()
@verified_email_required
def jobs(request):
    return render(request, 'backend/jobs.html', {'form': CommandsForm()})
class CommandsForm(Form):
    name = ModelChoiceField(queryset=Commands.objects.filter(active=1).values('name'))
    os = CharField(required=True, disabled=True)
    command_prefix = CharField(required=True, disabled=True)
    target = CharField(required=True)
    command = CharField(required=True, disabled=True)
    args = CharField(required=True, disabled=True)
    shell = CharField(required=True, disabled=True)
forms.py

class Commands(models.Model):
    command_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    command_prefix = models.TextField()
    command = models.TextField()
    args = models.TextField()
    shell = models.TextField()
    role = models.ForeignKey('Roles', models.DO_NOTHING)
    os = models.ForeignKey('Operatingsystems', models.DO_NOTHING)
    job_type = models.ForeignKey('Jobtypes', models.DO_NOTHING)
    active = models.IntegerField()
@verified_email_required
def jobs(request):
    return render(request, 'backend/jobs.html', {'form': CommandsForm()})
class CommandsForm(Form):
    name = ModelChoiceField(queryset=Commands.objects.filter(active=1).values('name'))
    os = CharField(required=True, disabled=True)
    command_prefix = CharField(required=True, disabled=True)
    target = CharField(required=True)
    command = CharField(required=True, disabled=True)
    args = CharField(required=True, disabled=True)
    shell = CharField(required=True, disabled=True)
url.py

urlpatterns = [
    url(r'^$', profile, name='profile'),
    url(r'^jobs/$', jobs, name='jobs'),
    url(r'^patchreport/$', patchreport, name='patchreport'),
    url(r'^prtbl/$', PatchReportTable.as_view(), name='patchreptbl')
]
jobs.html

{% extends "backend/base.html" %}
{% load staticfiles %}
{% load widget_tweaks %}

{% block title %}
    {{block.super}}Jobs
{% endblock %}

{% block content %}
<form id="jobs_form" class="form-horizontal text-center" method="post" action="{% url 'jobs' %}">
  {% csrf_token %}
  {{ form.non_field_errors }}

  <div class="form-group">
    {{ form.name.errors }}
    <label for="{{ form.name.id_for_label }}" class="col-sm-2 control-label">Name</label>
    <div class="col-sm-8">
      {{ form.name|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.os.id_for_label }}" class="col-sm-2 control-label">Os</label>
    <div class="col-sm-8">
      {{ form.os|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.command_prefix.id_for_label }}" class="col-sm-2 control-label">Command prefix</label>
    <div class="col-sm-8">
      {{ form.command_prefix|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.target.id_for_label }}" class="col-sm-2 control-label">Target</label>
    <div class="col-sm-8">
      {{ form.target|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.command.id_for_label }}" class="col-sm-2 control-label">Command</label>
    <div class="col-sm-8">
      {{ form.command|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.args.id_for_label }}" class="col-sm-2 control-label">Args</label>
    <div class="col-sm-8">
      {{ form.args|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <label for="{{ form.shell.id_for_label }}" class="col-sm-2 control-label">Shell</label>
    <div class="col-sm-8">
      {{ form.shell|add_class:"form-control" }}
    </div>
  </div>

  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-8">
      <button type="submit" class="btn btn-default" name="submit">Submit</button>
    </div>
  </div>

</form>

<script type="text/javascript" src="{% static "js/jobs.js" %}"></script>
{% endblock %}
{%extends“backend/base.html”%}
{%load staticfiles%}
{%load widget_tweaks%}
{%block title%}
{{block.super}}作业
{%endblock%}
{%block content%}
{%csrf_令牌%}
{{form.non_field_errors}}
{{form.name.errors}
名称
{form.name | add_类:“form control”}
操作系统
{form.os | add_类:“form control”}
命令前缀
{{form.command_prefix|add_class:“form control”}
目标
{{form.target}添加_类:“form control”}
命令
{form.command | add_类:“form control”}
Args
{{form.args | add_类:“form control”}
壳
{form.shell | add_类:“form control”}
提交
{%endblock%}

老实说,我不确定如何用Django的模型来实现这一点。目前,我接受了Michael Platt的建议,在名为
jobs.js
的javascript文件中,在
change
事件中使用javascript自动填充字段。我必须相信,有一种方法可以完成同样的事情,即直接从数据库填充整个表单,或者通过类似由TastyPie通过ajax调用生成的RESTful api的方式。

如果您不太喜欢使用javascript的概念,可以对特定的select字段使用.change()事件。所以它看起来像这样:

$(document).ready(function(){
    $("#id_name").change(function() {
        // Find your different fields you want to populate and set the values here.
        // Example would be 
        if ($("#id_name").val() == "Some value") {
            $("#id_command_prefix").val("Whatever you want to populate with.")
        }
    });
});

数据由数据库填充,因此我必须自己手动添加该数据,对吗?如果您是指当用户选择一个选项时,字段中预期的默认数据由数据库填充,那么是的,您必须手动将这些值编码到javascript中。我认为这个文档可能也有帮助,但我不确定它是否正是您想要的:看起来您可以在表单中设置一些初始值,但基本上每次我加载页面时,都会以某种方式、形状或形式更改一些我不得不使用Javascript的内容。