Одна вещь, которую можно сделать, повредить логический 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'
Я не знаю отличного способа сделать это, но вы могли бы сделать что-нибудь ужасное вроде этого:
#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-битной машине могут потребоваться битовые поля, и в этом случае вам нужно будет знать, как их размещает реализация.
Итак, если код предназначен для общей переносимости, вам может потребоваться просто определить любые упакованные структуры, которые вы необходимо в разделе вашего заголовочного файла для конкретной платформы.
Зачем вам что-то нужно в структуре?
Я думаю #pragma pack (1)
то же самое, или я что-то упустил?
Вы можете сделать это:
struct Foo
{
#pragma pack(push, 1)
int Bar;
#pragma pack(pop)
};
Но выглядит некрасиво.
Вы можете определить 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;
});