django: Как использовать ModelForm с возможностями динамического 0-n?

Quetion

Привет. Я пытаюсь выяснить лучший способ использовать одну форму для создания одного родительского объекта, а затем создать 0-n дочерних объектов. Я предполагаю, что ModelForms - это то, что мне нужно сделать, но мне трудно понять, как структурировать шаблон и представление. Хотел бы кто-нибудь объяснить, как создать n суб-объектов?

Исследование

Я прочитал несколько других статей и сообщений, касающихся этого:

Назвать несколько.

Детали

У меня есть две модели, такие как:

// 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 ответ

Решение

Это то, для чего предназначены модельные наборы, в частности, встроенные.

Другие вопросы по тегам