Автоматически сгенерируйте поля формы для Формы в django

В Подрывной деятельности (и 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 + способности к записи слияния, но рабочий процесс, кажется, намного более изобретен, чем в распределенных системах. Если это действительно имеет место, это, вероятно, потому что - как упомянуто в вышеупомянутом комментарии - фокус помещается на организацию репозитория, а не на сами изменения.

9
задан monkut 13 September 2009 в 14:29
поделиться

3 ответа

Взгляните на создание динамических форм в Django с b-list.org и uswaretech.com . Я успешно использовал эти примеры для динамического создания содержимого форм из моделей.

1
ответ дан 3 November 2019 в 07:48
поделиться

Итак, вы не можете устанавливать такие поля в 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})
2
ответ дан 3 November 2019 в 07:48
поделиться

Вам нужен набор форм. Это даст вам набор строк, каждая из которых соответствует определенному навыку.

См. Документацию Formset и страницу, посвященную созданию наборов форм для моделей .

1
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

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