Django: многоуровневые модели в одном шаблоне с помощью [закрытых] форм

при условии, что вы загрузили все библиотеки jquery ui

, затем

$(function() {
   $("tr").draggable();
});
109
задан hynekcer 18 March 2015 в 15:15
поделиться

4 ответа

Это действительно не слишком трудно для реализации с ModelForms. Так позволяет, говорят, что у Вас есть Формы A, B, и C. Вы распечатываете каждую из форм и страницы, и теперь необходимо обработать POST.

if request.POST():
    a_valid = formA.is_valid()
    b_valid = formB.is_valid()
    c_valid = formC.is_valid()
    # we do this since 'and' short circuits and we want to check to whole page for form errors
    if a_valid and b_valid and c_valid:
        a = formA.save()
        b = formB.save(commit=False)
        c = formC.save(commit=False)
        b.foreignkeytoA = a
        b.save()
        c.foreignkeytoB = b
        c.save()

Здесь документы для пользовательской проверки.

82
ответ дан Jason Christa 24 November 2019 в 03:23
поделиться

Я совсем недавно имел некоторую проблему и просто выяснил, как сделать это. Принятие Вас имеет три класса, Основные, B, C и что B, C имеют внешний ключ к основному

    class PrimaryForm(ModelForm):
        class Meta:
            model = Primary

    class BForm(ModelForm):
        class Meta:
            model = B
            exclude = ('primary',)

    class CForm(ModelForm):
         class Meta:
            model = C
            exclude = ('primary',)

    def generateView(request):
        if request.method == 'POST': # If the form has been submitted...
            primary_form = PrimaryForm(request.POST, prefix = "primary")
            b_form = BForm(request.POST, prefix = "b")
            c_form = CForm(request.POST, prefix = "c")
            if primary_form.is_valid() and b_form.is_valid() and c_form.is_valid(): # All validation rules pass
                    print "all validation passed"
                    primary = primary_form.save()
                    b_form.cleaned_data["primary"] = primary
                    b = b_form.save()
                    c_form.cleaned_data["primary"] = primary
                    c = c_form.save()
                    return HttpResponseRedirect("/viewer/%s/" % (primary.name))
            else:
                    print "failed"

        else:
            primary_form = PrimaryForm(prefix = "primary")
            b_form = BForm(prefix = "b")
            c_form = Form(prefix = "c")
     return render_to_response('multi_model.html', {
     'primary_form': primary_form,
     'b_form': b_form,
     'c_form': c_form,
      })

, Этот метод должен позволить Вам делать безотносительно проверки, которой Вы требуете, а также генерирующий все три объекта на той же странице. Я также использовал JavaScript и скрыл поля для разрешения поколения нескольких B, C объекты на той же странице.

25
ответ дан 24 November 2019 в 03:23
поделиться

"Я хочу скрыть некоторые поля и сделать некоторую сложную проверку".

я запускаю со встроенного администраторского интерфейса.

  1. Сборка ModelForm для показа желаемых полей.

  2. Расширяют Форму с помощью правил проверки в форме. Обычно это clean метод.

    Быть уверенной эта часть работает обоснованно хорошо.

, После того как это сделано, можно переехать от встроенного администраторского интерфейса.

Затем можно дурачиться с несколькими, частично связанными формами на единственной веб-странице. Это - набор шаблонного материала для представления всех форм на единственной странице.

Затем Вы должны записать функцию представления для чтения и проверили различные вещи формы, и сделайте различный объект сохраняет ().

"Действительно ли это - вопросы проектирования, если я ломаюсь и ручной код все?" Нет, Это - просто много времени для не много преимущества.

3
ответ дан S.Lott 24 November 2019 в 03:23
поделиться

Я был примерно в такой же ситуации день назад, и вот мои 2 цента:

1) Я нашел, пожалуй, самую короткую и краткую демонстрацию записи нескольких моделей в единой форме здесь: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .

В двух словах: создайте форму для каждой модели, отправьте их обе в шаблон в одном

, используя ключевой аргумент префикс , и проверьте дескриптор представления. Если есть зависимость, просто убедитесь, что вы сохранили "родительский" модель перед зависимой, и использовать родительский ID для внешнего ключа перед сохранением «дочерней» модели. В ссылке есть демонстрация.

2) Возможно, это можно сделать с помощью наборов форм, но, насколько я понял, наборы форм в основном предназначены для ввода кратных одной и той же модели, которая может быть необязательно связана к другой модели / моделям по внешним ключам. Однако, похоже, нет опции по умолчанию для ввода данных более чем одной модели, и набор форм, по-видимому, предназначен не для этого.

63
ответ дан 24 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: