В Подрывной деятельности (и CVS), репозиторий прежде всего. В мерзавце и подвижный нет действительно понятия репозитория таким же образом; здесь изменения являются центральной темой.
+1
стычка в CVS/SVN прибывает из того, что эти системы делают не , помнят статус родителя изменений. В Мерзавце и Подвижный, мало того, что фиксация может иметь несколько детей, она может также иметь несколько родителей!
, Который может легко наблюдаемое использование одного из графических инструментов, gitk
или hg
view
. В следующем примере ответвление № 2 было разветвлено от № 1 в фиксации A и было с тех пор объединено однажды (в M, объединенном с фиксацией B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Примечание, как A и B имеют двух детей, тогда как M имеет два родители . Эти отношения , записал в репозитории. Скажем, специалист по обслуживанию ответвления № 2 теперь хочет объединить последние изменения от ответвления № 1, они могут дать команду, такую как:
$ git merge branch-1
и инструмент будет автоматически знать, что основой является B - потому что это было зарегистрировано в фиксации M, предке подсказки № 2 - и что это должно объединиться что бы ни случилось между B и C. CVS не записывает эту информацию, ни сделал SVN до версии 1.5. В этих системах график был бы похож:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
, где M является просто гигантской "раздавленной" фиксацией всего, что произошло между A и B, примененным сверху M. Обратите внимание, что после того, как дело сделано, существует , никакая трассировка не уехала (кроме потенциально в человекочитаемых комментариях) того, где M действительно происходил из, ни , сколько фиксации были свернуты вместе - создание истории, намного более непроницаемой.
Что еще хуже, выполнение второго слияния становится кошмаром: нужно выяснить то, чем основа слияния была во время первого слияния (и один имеет к [1 111], знают , что было слияние во-первых!), затем представьте ту информацию инструменту так, чтобы это не пыталось воспроизвести A.. B сверху M. Все это достаточно трудно при работе в тесном сотрудничестве, но просто невозможно в распределенной среде.
А (имел отношение), проблема состоит в том, что нет никакого способа ответить на вопрос: "X содержат B?" где B является потенциально важным исправлением ошибки. Так, почему не только запись, что информация в фиксации, так как это известно во время слияния!
P.S. - у меня нет опыта с SVN 1.5 + способности к записи слияния, но рабочий процесс, кажется, намного более изобретен, чем в распределенных системах. Если это действительно имеет место, это, вероятно, потому что - как упомянуто в вышеупомянутом комментарии - фокус помещается на организацию репозитория, а не на сами изменения.
Взгляните на создание динамических форм в Django с b-list.org и uswaretech.com . Я успешно использовал эти примеры для динамического создания содержимого форм из моделей.
Итак, вы не можете устанавливать такие поля в forms.Form по причинам, которые станут очевидными, когда вы увидите DeclarativeFieldsMetaclass , метакласс форм.Form (но не forms.BaseForm). Решение, которое может быть излишним в вашем случае, но пример того, как может быть выполнено построение динамической формы, выглядит примерно так:
base_fields = [
forms.MultipleChoiceField(choices=[
(pk, s.name) for s in c.skill_set.all()
]) for c in SkillCategory.objects.all()
]
SkillSelectionForm = type('SkillSelectionForm', (forms.BaseForm,), {'base_fields': base_fields})
Вам нужен набор форм. Это даст вам набор строк, каждая из которых соответствует определенному навыку.
См. Документацию Formset и страницу, посвященную созданию наборов форм для моделей .