Django使用基于单选字段的模型数据自动填充整个表单
我试图创建一个基于单个select字段填充所有字段的modelform。基本上,当用户从下拉列表中选择一个值时,它将根据数据库中的数据填充其余字段 型号.py: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()
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的内容。