質問
こんにちは。1つのフォームを使用して1つの親オブジェクトを作成してから、0〜n個のサブオブジェクトを作成するための最良の方法を見つけようとしています。ModelFormsを実行する必要があると思いますが、テンプレートとビューの構造を理解するのに苦労しています。誰かがn個のサブオブジェクトを作成する方法を喜んで説明しますか?
リサーチ
私はこれに関連する他のいくつかの記事や投稿を読みました:
- django model / modelForm-choiceFieldで動的な選択を取得する方法は?
- https://stackoverflow.com/questions/5575560/how-do-i-create-a-drop-down-menu-in-django-using-a-modelform-with-dynamic-values
- http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/
- DjangoModelFormのsaveメソッドをオーバーライドする
いくつか例を挙げると。
詳細
私はそのような2つのモデルを持っています:
// models.py
class DataItem(models.Model):
name = models.CharField(max_length=255)
date_created = models.DateTimeField(auto_now_add=True)
date_last_updated = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, blank=False)
def __unicode__(self):
return self.name
class DataItemSet(models.Model):
item = models.ForeignKey(DataItem, blank=False)
type_ind = models.IntegerField()
そして、対応する2つのModelFormを作成しました。
// forms.py
class CreateDataItemForm(forms.ModelForm):
class Meta:
model = DataItem
exclude = ('owner',)
def save(self, user, commit=True):
item = super(CreateDataItemForm,self).save(commit=False)
item.owner = user
if commit:
item.save()
return item
class CreateDataItemSetForm(forms.ModelForm):
class Meta:
model = DataItemSet
exclude = ('item',)
def save(self, parent, commit=True):
set = super(CreateDataItemSetForm,self).save(commit=False)
set.item = parent
if commit:
set.save()
return set
そして、私の見解では、1つのフォームに、が所有する新しいDataItem1-nの作成を送信させようとしています。フォームの出力例を次に示します。DataItemSetDataItem

そしてテンプレート:
<form action="." method="post">
{% csrf_token %}
<table>
{{ create_form.as_table }}
</table>
<table>
<tr>
<th>What to track:</th>
<td>
<select>
<option value="1">Number</option>
<option value="2">Currency ($)</option>
<option value="3">Date</option>
<option value="4">Day</option>
<option value="5">Time</option>
</select>
</td>
<td>
</td>
</tr>
<tr>
<th>What to track:</th>
<td>
<select>
<option value="1">Number</option>
<option value="2">Currency ($)</option>
<option value="3">Date</option>
<option value="4">Day</option>
<option value="5">Time</option>
</select>
</td>
<td>
<button type="button">+</button>
</td>
</tr>
</table>
<p>
<button type="submit">Create</button>
</p>
</form>
そして最後に、ビュー:
// views.py
@login_required
@csrf_protect
def create_data_item(request):
create_form = CreateDataItemForm()
c = {'create_form':create_form}
c.update(csrf(request))
if request.method == 'POST':
data = request.POST.copy()
form = CreateDataItemForm(data, instance=DataItem())
item_sets = [CreateDataItemSetForm(request.POST, prefix=str(x), instance=DataItemSet()) for x in range(0,9)]
if form.is_valid():
# create new data item
new_item = form.save(request.user)
#create new set of stuff to track
for item_set in item_sets:
new_item_set = item_set.save(new_item)
# return to the add entry page
return redirect('/add')
else:
return render_to_response('internal/create_data_item.html',c)
から0-n個のDataItemSetを動的に抽出できるようにする方法がありませんform。ModelFormではわかりません。
助けてくれてありがとう!