我在這裏有一個問題,我希望你能幫助..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