我在这里有一个问题,我希望你能帮助..Django - 我如何迭代modelform的选项?
这是我想要实现的。
基本上我有一个小的web应用程序,我有3种形式。在这里我要请name
和age
一种形式为老人和一种形式为一年轻男子
第一种形式,我会在模板中看到的将是第一种形式
主要形式之一,在那里我会输入name
并选择它是老年人还是年轻人。
,使其按预期工作,一旦我选择young
或old
它会与jQuery相应form
显示,如果我进入old
我会看到形式的老人,如果我进入年轻的时候会看到一个年轻人的形式。
jQuery和一切工作,除了由第一种形式确定..
所有我需要的是展示我的第一种形式的模板为modelform
。
我知道我可以使它与普通表格完美配合,但我需要在我的数据库中保存age
和name
。
这里是我的模型:
AGES = (
('OLD', 'OLD'),
('YOUNG', 'YOUNG '),
)
class Person(models.Model):
name = models.TextField()
age = models.CharField(max_length=128,choices=AGES, default=True)
def __str__(self):
return self.name
class Questions_old(models.Model):
person = models.ForeignKey(Person)
country = models.TextField()
hobbies = models.TextField()
def __str__(self):
return self.person.name
class Questions_young(models.Model):
person = models.ForeignKey(Person)
country = models.TextField()
parents = models.TextField()
def __str__(self):
return self.person.name
我的形式:
class personForm(forms.ModelForm):
class Meta:
model = Person
fields = ["age","name"]
def __init__(self, *args, **kwargs):
super(personForm, self).__init__(*args, **kwargs)
self.fields['age'].choices = [(e.id, e.age) for e in Person.objects.all()]
class person_oldForm(forms.ModelForm):
class Meta:
model = Questions_old
exclude = ('name',)
fields = ['country','hobbies']
class person_youngForm(forms.ModelForm):
class Meta:
model = Questions_young
exclude = ('name',)
fields = ['country','parents']
观点:
def person_form(request):
form1 = personForm(request.POST or None)
form2 = person_oldForm(request.POST or None)
form3 = person_youngForm(request.POST or None)
queryset1 = Person.objects.all()
queryset2 = Questions_old.objects.all()
queryset3 = Questions_young.objects.all()
context = {
"form1": form1,
"form2": form2,
"form3": form3,
"queryset1": queryset1,
}
form1_valid = form1.is_valid()
form2_valid = form2.is_valid()
form3_valid = form3.is_valid()
if form1.is_valid():
person = form1.save()
if form2_valid:
qo = form2.save(commit=False)
qo.person = person
qo.save()
if form3_valid:
qy = form3.save(commit=False)
qy.person = person
qy.save()
return render(request, "person.html", context)
模板:
<div class="form-group">
<select id="age" name="age">
{% for x,y in form.fields.age.choices %}
<option value="{{ x }}"{% if form.fields.age.value == x %} selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
</div>
<div id="form" class="ages" style="display:none;">
<form method="POST" action="">{% csrf_token %}
{{ form2|crispy }}
<button type="submit" name="submit" class="btn btn-success btn-xs">
<span class="fa fa-floppy-o"></span> Guardar
</button>
</form>
</div>
<div id="form1" class="ages" style="display:none;">
<form method="POST" action="">{% csrf_token %}
{{ form3|crispy }}
<button type="submit" name="submit" class="btn btn-success btn-xs">
<span class="fa fa-floppy-o"></span> Guardar
</button>
</form>
</div>
<script>
$('#age').on('change',function(){
if($(this).val()==="old"){
$("#form").show()
}
else{
$("#form").hide()
}
if($(this).val()==="young"){
$("#form1").show()
}
else{
$("#form1").hide()
}
});
</script>
当我运行我的代码时,我得到一个空的select
,它不显示我的选择如预期的那样。
我该如何使它工作良好?
在此先感谢!
目前您的“人”表中是否有任何条目?看起来你正在使用该表中的项目作为你的选择。 – anupsabraham
如果你只是想显示老的和年轻的,删除'personForm'的'__init__'方法应该工作,因为Django会从你的模型字段中选择选项。 – anupsabraham