django, встроенный в манипуляции с формами [дубликат]

Я попытался написать Object.assignDeep, который основан на пополнении Object.assign на mdn .

(ES5)

Object.assignDeep = function (target, varArgs) { // .length of function is 2
    'use strict';
    if (target == null) { // TypeError if undefined or null
        throw new TypeError('Cannot convert undefined or null to object');
    }

    var to = Object(target);

    for (var index = 1; index < arguments.length; index++) {
        var nextSource = arguments[index];

        if (nextSource != null) { // Skip over if undefined or null
            for (var nextKey in nextSource) {
                // Avoid bugs when hasOwnProperty is shadowed
                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                    if (typeof to[nextKey] === 'object' 
                        && to[nextKey] 
                        && typeof nextSource[nextKey] === 'object' 
                        && nextSource[nextKey]) {                        
                        Object.assignDeep(to[nextKey], nextSource[nextKey]);
                    } else {
                        to[nextKey] = nextSource[nextKey];
                    }
                }
            }
        }
    }
    return to;
};
console.log(Object.assignDeep({},{a:{b:{c:1,d:1}}},{a:{b:{c:2,e:2}}}))

24
задан Collin Allen 4 October 2016 в 21:55
поделиться

4 ответа

См. ModelChoiceField . Вы должны установить empty_label в None. Таким образом, ваш код будет выглядеть примерно так:

class BookSubmitForm(ModelForm):
    library = ModelChoiceField(queryset=Library.objects, empty_label=None)

    class Meta:
        model = Book    

EDIT: изменил имя поля на нижний регистр

29
ответ дан Uma 18 August 2018 в 22:06
поделиться
  • 1
    Это своего рода работы, но я по-прежнему вижу оригинальный ChoiceField в форме с пустым выбором наряду с новым, с тем же ярлыком и с тем же выбором, но без пустого выбора. Похоже, этот метод не переопределяет форму, а расширяет ее тем же полем. – Bastian 10 January 2012 в 11:32
  • 2
    Хорошо, что это плохо, это была опечатка, я использовал прописную первую букву, как в вашем примере «Библиотека». При переключении на строчную "библиотеку" он фактически переопределяет поле. Благодаря! – Bastian 10 January 2012 в 12:01
  • 3
    Большой! Вы также можете просто self.fields['library'].empty_label = None, если вы не собираетесь менять запрос. – guival 14 December 2017 в 12:44

self.fields['xxx'].empty_label = None не работает Если тип поля - TypedChoiceField, у которого нет свойства empty_label. Что мы должны сделать, так это удалить первый выбор:

class BookSubmitForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BookSubmitForm, self).__init__(*args, **kwargs)

        for field_name in self.fields:
            field = self.fields.get(field_name)
            if field and isinstance(field , forms.TypedChoiceField):
                field.choices = field.choices[1:]
9
ответ дан Alvaro 18 August 2018 в 22:06
поделиться
  • 1
    Используйте это только в том случае, если вы не можете установить значение по умолчанию для поля вашей модели, что является более чистой альтернативой (см. Ответ Дэниела Соколовского). – gengkev 2 August 2018 в 07:37

Если вы укажете blank=False и default=<VALUE> в определении поля модели, то Django по умолчанию не сделает пустой выбор; обратите внимание, что значение по умолчанию может быть неверным выбором и, например, установить на '' или любой invalid choice.

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False, default='')
    ...
7
ответ дан Daniel Sokolowski 18 August 2018 в 22:06
поделиться
  • 1
    Изменение модели только для соответствия форме кажется неправильным. Это должно быть сделано только в том случае, если для вашей модели имеет смысл вести себя таким образом. – guival 14 December 2017 в 12:42

Если вы используете ModelForm, вам не нужно указывать запрос, требуемый, ярлык и т. д. Но для ответа на повторный вызов вам нужно сделать это снова.

Фактически вы можете сделать это, чтобы избежать повторного -выполнение всех

class BookSubmitForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(BookSubmitForm, self).__init__(*args, **kwargs)
        self.fields['library'].empty_label = None

    class Meta:
        model = Book 
7
ответ дан Henry Liu 18 August 2018 в 22:06
поделиться
  • 1
    Почему-то это не работает для меня. Я все еще вижу "--------- & quot; как один из вариантов, если set empty_label = None, как указано выше. Это все еще актуально для Django 1.10? – Anupam 7 June 2017 в 09:31
  • 2
    Фактически, я решил, что это TypedChoiceField, и, следовательно, ответ Мифрила ниже работает. – Anupam 7 June 2017 в 10:23
Другие вопросы по тегам:

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