Создание родительских и дочерних объектов модели из одной отправки формы - PullRequest
6 голосов
/ 18 апреля 2011

В моей модели есть родительский объект, каждый из которых может иметь ноль или более дочерних объектов, связанных внешним ключом.

Моя автоматически генерируемая ModelForm отлично работает для родительского объекта, но я бы хотел, чтобы пользовательчтобы иметь возможность создавать один или несколько дочерних объектов одновременно с созданием родительского.Обратите внимание, я не имею в виду выбор из уже существующих дочерних объектов - я имею в виду создание дочерних объектов с нуля ...

В настоящее время я использую много магии Джанго, чтобы форма появлялась с очень небольшимОбразец от меня: я понимаю, что, вероятно, придется изменить, чтобы сделать это!

Вот идея того, что у меня есть на данный момент:

# urls.py
(r'^create/$',
    CreateAppView.as_view(
        model=App,
        template_name='edit.html')),

# edit.html
<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
<input type="submit" value="Submit" />
</form>

# model
class App(models.Model):
    name = models.CharField(max_length=100)

class Activation(models.Model):
    app = models.ForeignKey(App)

# view
class AppForm(ModelForm):
    class Meta:
        model = App

class CreateAppView(CreateView):
    def post(self, request, *args, **kw):
        form = AppForm(request.POST)
        if form.is_valid():
            app = form.save()
            return HttpResponseRedirect(reverse('app_detail', args=(app.id,)))
        else:
            return super(CreateAppView, self).post(request, *args, **kw)

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

На самом деле, весь этот вид функциональности предоставляется уже в виде наборов встроенных моделей .

2 голосов
/ 18 апреля 2011

добавить несколько форм с разными именами?

Проблема в том, что вам нужно знать, сколько форм визуализируется, и иметь гораздо более конкретный шаблон.

что-то вроде:

# edit.html
<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ appform.as_p }}
    {{ appform2.as_p }}
<input type="submit" value="Submit" />
</form>

и в представлении:

appform= AppForm(request.POST, prefix="1")
appform2= AppForm(request.POST, prefix="2")

Это также будет работать для разных моделей:

appform= AppForm(request.POST, prefix="app")
spamform = SpamForm(request.POST, prefix="spam")

Я не уверен насчет вашего urls.py, потому что я никогда не использовал эту функцию / ярлык ... thingy;)

0 голосов
/ 03 августа 2011

Чтобы создать связанные модели в одном представлении, используя наборы форм встроенных моделей, посмотрите это сообщение SO :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...