Django Выбрать шаблон группы виджетов - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть следующие модели:

# Group for Key/Value pairs
class Group(models.Model):
    name = models.TextField(unique=True)

    def __unicode__(self):
        return self.name


    class Meta:
        verbose_name = 'Group'
        verbose_name_plural = 'Groups'

# Key is the key/name for a Value
class Key(models.Model):
    name = models.TextField(unique=True)

    def __unicode__(self):
        return self.name


    class Meta:
        verbose_name = 'Key'
        verbose_name_plural = 'Keys'

# Value is the value/content of a key
class Value(models.Model):
    value = models.TextField()

    def __unicode__(self):
        return '%s' % self.value


    class Meta:
        verbose_name = 'Value'
        verbose_name_plural = 'Values'

class Key_Value(models.Model):
    group = models.ForeignKey(Group)
    key = models.ForeignKey(Key)
    value = models.ForeignKey(Value)

    def __unicode__(self):
        return '%s = %s' % (self.key.name, self.value.value)


    class Meta:
        verbose_name = 'Key/Value Paar'
        verbose_name_plural = 'Key/Value Paare'


Now I pass the form to the template:
def exampleview(request):
    key_value_form = Key_Value_Form(request.POST)
    return render_to_response(
            'edit.html', {
                'key_value_form': key_value_form,
                })

Теперь давайте посмотрим на возможные данные

KEY/VALUE PARIRS:
key = TEST 1
value = TEST 1
group = TESTGROUP 1

key = TEST 2
value = TEST 2
group = TESTGROUP 2

Теперь я изменил виджеты по умолчанию для записей таблицы ключей / значений для выбора виджетов.

Вот что я хочу сделать:

SELECT GROUP [+] [-]
   --> [Now choose Key/Value pair belonging to group] [+] [-]

в начале вы всегда получаете два выбора: один для группы и один для пары ключ / значение.если вы нажмете + на ГРУППЕ, должна появиться новая кнопка выбора группы вместе с выбором пары КЛЮЧ / Значение, если вы нажмете + на кнопке Выбор / значение, появится новое окно выбора ключа / значения.

У меня две проблемы:

ОДИН: Я не знаю, как должна выглядеть проверка в шаблоне, и ДВА: Как я могу реализовать эти кнопки + -

Любая помощьценится .Было бы здорово, если бы это было возможно без javascript, но у меня не очень большие надежды в этом направлении

1 Ответ

0 голосов
/ 09 ноября 2011

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

# note that the dictionary d shown here is just an example
# yours should have actual group foreign keys based on Group model
d = { 'first' : 5,  'second' : 3, 'third' : 2 }

def make_groupkeys_form(descriptor):
    groups = { 'select': '', 'keypairs' : [] }
    fields = { 'groups' : groups }

    for group, numkeys in descriptor.values():
        groupchoices = # find out what choices you need to offer for group widget
        groups['select'] = forms.SelectField(choices=groupchoices)
        for i in range(numkeys):
             keyvalchoices = # find out what choices you need to offer for keyval widget per group
             groups['keypairs'].append(forms.SelectField(choices=keyvalchoices))

    # now you have enough SelectFields for all your groups and keyval pairs
    return type('Key_Value_Form', (forms.BaseForm,), { 'base_fields': fields })

# from view handler
def exampleview(request):
    # determine from request how many groups you want and how many keyval widgets per group, for example here I will use the above predefined d

    key_value_form = make_groupkeys_form(d)
    return render_to_response(
            'edit.html', {
                'key_value_form': key_value_form,
                })

Обратите внимание, что вы можете (идолжен) переписать класс Key_Value_Form для наследования от форм. BaseForm и поместить код make_groupkeys_form (дескриптор) в его член __init__(request, descriptor).Вам также нужно будет написать свой собственный is_valid() для перечисления через поля выбора и убедиться, что выбор правильный, когда пользователь отправляет форму, и переопределить clean(), чтобы попытаться проверить выбор отдельных пользователей.

Наконецрассмотрим прохождение динамических форм, прочитанных .Он шаг за шагом поможет вам создать динамические формы в django.

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