django: Как использовать ModelForm с возможностями динамического 0-n?
Quetion
Привет. Я пытаюсь выяснить лучший способ использовать одну форму для создания одного родительского объекта, а затем создать 0-n дочерних объектов. Я предполагаю, что ModelForms - это то, что мне нужно сделать, но мне трудно понять, как структурировать шаблон и представление. Хотел бы кто-нибудь объяснить, как создать n суб-объектов?
Исследование
Я прочитал несколько других статей и сообщений, касающихся этого:
- Как получить динамический выбор в choiceField?
- https://stackru.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/
- Переопределение метода сохранения в Django ModelForm
Назвать несколько.
Детали
У меня есть две модели, такие как:
// 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()
И я создал две ModelForms для соответствия:
// 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
И, на мой взгляд, я пытаюсь, чтобы одна форма представила создание нового DataItem
и 1-н DataItemSet
ы, которые принадлежат DataItem
, Вот пример вывода формы:
И шаблон:
<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 DataItemSets из form
, Я не могу понять это с ModelForm.
Спасибо за любую помощь!
1 ответ
Это то, для чего предназначены модельные наборы, в частности, встроенные.