при условии, что вы загрузили все библиотеки jquery ui
, затем
$(function() {
$("tr").draggable();
});
Это действительно не слишком трудно для реализации с 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()
Здесь документы для пользовательской проверки.
Я совсем недавно имел некоторую проблему и просто выяснил, как сделать это. Принятие Вас имеет три класса, Основные, 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 объекты на той же странице.
"Я хочу скрыть некоторые поля и сделать некоторую сложную проверку".
я запускаю со встроенного администраторского интерфейса.
Сборка ModelForm для показа желаемых полей.
Расширяют Форму с помощью правил проверки в форме. Обычно это clean
метод.
Быть уверенной эта часть работает обоснованно хорошо.
, После того как это сделано, можно переехать от встроенного администраторского интерфейса.
Затем можно дурачиться с несколькими, частично связанными формами на единственной веб-странице. Это - набор шаблонного материала для представления всех форм на единственной странице.
Затем Вы должны записать функцию представления для чтения и проверили различные вещи формы, и сделайте различный объект сохраняет ().
"Действительно ли это - вопросы проектирования, если я ломаюсь и ручной код все?" Нет, Это - просто много времени для не много преимущества.
Я был примерно в такой же ситуации день назад, и вот мои 2 цента:
1) Я нашел, пожалуй, самую короткую и краткую демонстрацию записи нескольких моделей в единой форме здесь: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
В двух словах: создайте форму для каждой модели, отправьте их обе в шаблон в одном
, используя ключевой аргумент префикс
, и проверьте дескриптор представления. Если есть зависимость, просто убедитесь, что вы сохранили "родительский"
модель перед зависимой, и использовать родительский ID для внешнего ключа перед сохранением «дочерней» модели. В ссылке есть демонстрация.
2) Возможно, это можно сделать с помощью наборов форм, но, насколько я понял, наборы форм в основном предназначены для ввода кратных одной и той же модели, которая может быть необязательно связана к другой модели / моделям по внешним ключам. Однако, похоже, нет опции по умолчанию для ввода данных более чем одной модели, и набор форм, по-видимому, предназначен не для этого.