Django, ModelChoiceField () и начальное значение

Если вы хотите сделать действительно безобразным, вы можете выполнить практически все. Я отвечаю только потому, что это дразнилка для мозга.

Вы можете определить макрос следующим образом:

#define some_func(a) for(static auto f = create_foo(); some_func(a, f), false;)

Да, это будет работать. В стандартном C ++ предложение init цикла for может содержать объявление статической переменной. Таким образом, переменная будет инициализирована только один раз. Тогда «условие» - это фактический вызов some_func, за которым следует оператор запятой с false, поэтому функция выполняется только один раз при каждом входе в цикл for.

Адаптация вашего кода из Arduino к стандартному C ++ и симуляция четырех циклов привела к тому же результату, который вы хотели. Смотрите это в прямом эфире .


В качестве альтернативы, если вы хотите казаться немного менее загадочным (но с чего бы это?), вы можете выбрать следующее:

#define some_func(a) do {static auto f = create_foo(); some_func(a, f); } while(0)

То же самое на самом деле.


Хорошо, применение этого к вашей реальной проблеме требует чего-то другого:

#define debounce(a) [](int v){static Debounce d = create_debounce(); \
                              return debounce(d, v); }(a)

Это определяет и немедленно вызывает лямбду. Поскольку лямбда-выражение создает уникальный тип замыкания везде, где он появляется в программе, это создаст уникальный статический объект для каждого выражения, в которое вы пишете debounce(...). Альтернативой является специальное выражение оператора GCC. Но в отличие от лямбды, это расширение. Который вы можете или не можете использовать, YMMV.

54
задан Dominic Rodger 28 November 2010 в 09:46
поделиться

2 ответа

Если вы хотите установить начальное значение по умолчанию, вы должны определить initial , как и другие поля формы, за исключением того, что вы устанавливаете для него идентификатор вместо .

Допустим, у вас есть field1 , например:

class YourForm(forms.Form):
    field1 = forms.ModelChoiceField(queryset = MyModel.objects.all() )

, тогда вам нужно установить initial, когда вы создаете форму, например:

form = YourForm(initial = {'field1': instance_of_mymodel.pk })

, а не:

form = YourForm(initial = {'field1': instance_of_mymodel })

Я также предполагаю, что вы определили __ unicode __ для своих моделей, чтобы это отображалось правильно.

90
ответ дан 7 November 2019 в 07:51
поделиться
field1 = forms.ModelChoiceField(queryset=Model.objects.all(), empty_label="Selected value")

Это столь же просто как это....!

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

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