私はあなたが助けてくれることを願っています。ここに問題があります。Django - modelformでオプションを反復処理するにはどうすればよいですか?
ここで私が達成しようとしていることがあります。
基本的に私は3つのフォームがある小さなウェブアプリケーションを持っています。私は若い男
私は最初の形式になりますテンプレートに表示されます最初のフォームのための老人のためのname
とage
一つの形と1つの以上のフォームのために求めている
1メインフォーム、ここで私はname
と入力し、それが古いか若い男かを選択します。予想通り、それは私がyoung
またはold
を選択したら、それは私がold
を入力する場合、私は老人のためのフォームが表示されますし、私は若い入力した場合、私は若い男のためのフォームが表示されますform
対応するjQueryを使って表示されます動作させるために
。
jQueryとすべてが最初のフォーム..
による場合を除いて、[OK]働く私に必要なのは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
が表示されていますが、私の選択が期待どおりに表示されません。
どうすればうまく動作させることができますか?
ありがとうございます!
現在、「Person」テーブルにエントリがありますか?そのテーブルの項目を選択肢として使用しているようです。 – anupsabraham
古いものと若いものを表示したいだけなら、djangoはモデルフィールドから選択肢を選ぶので、 'personForm'の' __init__'メソッドを削除するとうまくいくはずです。 – anupsabraham