我在这里遇到问题,希望你能帮忙..
这就是我想要实现的目标。
基本上我有一个小的Web应用程序,我有3个表单。
我要求name
和age
的一个主要表单
一个老人的形式和另一个年轻人的形式
我将在模板中看到的第一个表单将是第一个表单,我将在其中输入name
并选择是否是一个老人或年轻人。
在我选择young
或old
后,如果我输入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
,它没有按预期显示我的选择..
如何让它运作良好?
提前致谢!
答案 0 :(得分:2)
问题出在您__init__
的{{1}}方法中。您正在从模型的条目中设置选项。
personForm
相反,你应该让django从模型字段选择中选择你的选择。为此,您根本不必定义self.fields['age'].choices = [(e.id, e.age) for e in Person.objects.all()]
方法。来自docs:
如果模型字段已设置选项,则表单字段的窗口小部件将设置为“选择”,其中的选项来自模型字段的选项。选项通常包括默认选择的空白选项。如果该字段是必需的,则强制用户进行选择。如果模型字段为空白= False且显式默认值(最初将选择默认值),则不包括空白选项。