Visual C++, эквивалентный из GCC's __, приписывает __ ((__ упакованный __))

Одна вещь, которую можно сделать, повредить логический fieldsets в отдельные образцовые классы формы.

class PersonalInfoForm (forms.ModelForm):
    class Meta:
        model=MyModel
        fields=('field1', 'field2', ...)

class TermsForm (forms.ModelForm):
    class Meta:
        model=MyModel
        fields=('fieldX', 'fieldY', ...)

Передают их Вашему шаблону в различных переменных и разбивают formsets:

<form ...>
   <fieldset><legend>Personal Information</legend>
       {{ personal_info_form }}
   </fieldset>
   <fieldset><legend>Terms and Conditions</legend>
       {{ terms_form }}
   </fieldset>
</form>

В этом смысле каждый из Ваших классов формы является просто фрагментом фактической HTML-формы.

Это представляет легкую сложность, когда Вы звоните, экономят на форме. Вы, вероятно, захотите передать commit=False и затем объединить результирующие объекты. Или просто избегайте использования ModelForm.save в целом и заполните свой объект модели вручную с 'cleaned_data'

45
задан Malkocoglu 8 October 2009 в 13:56
поделиться

3 ответа

Я не знаю отличного способа сделать это, но вы могли бы сделать что-нибудь ужасное вроде этого:

#include "packed.h"
struct Foo { /* members go here */ } PACKED;
#include "endpacked.h"

Затем для MSVC, pack.h:

#define PACKED
#pragma pack(push,1)

endpacked.h

#pragma pack(pop)
#undef PACKED

Для gcc, Packed.h:

#define PACKED __attribute__ ((__packed__))

endpacked.h:

#undef PACKED

По сути, упаковка слишком зависит от платформы. Предположим, что ваша упакованная структура имеет 8-битные поля, и рассмотрим некоторую систему с 16-битным байтом. У него не может быть структуры, представляющей ваши данные просто путем упаковки - вам нужно знать, как 8-битные байты преобразуются в 16-битные байты при передаче между двумя системами. Структуре на 16-битной машине могут потребоваться битовые поля, и в этом случае вам нужно будет знать, как их размещает реализация.

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

28
ответ дан 26 November 2019 в 20:54
поделиться

Зачем вам что-то нужно в структуре?

Я думаю #pragma pack (1) то же самое, или я что-то упустил?

Вы можете сделать это:

struct Foo
{
#pragma pack(push, 1)
int Bar;
#pragma pack(pop)
};

Но выглядит некрасиво.

3
ответ дан 26 November 2019 в 20:54
поделиться

Вы можете определить PACK следующим образом для GNU GCC и MSVC :

#ifdef __GNUC__
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
#endif

#ifdef _MSC_VER
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
#endif

И используйте его так:

PACK(struct myStruct
{
    int a;
    int b;
});
74
ответ дан 26 November 2019 в 20:54
поделиться
Другие вопросы по тегам:

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