Встроенная форма в Django - удаление определенных полей - PullRequest
10 голосов
/ 18 февраля 2009

Мне нужно создать встроенный набор форм, который

a) исключает отображение некоторых полей из MyModel в целом

b) отображает некоторые поля MyModel, но не позволяет их редактировать.

Я попытался использовать приведенный ниже код, используя values(), чтобы отфильтровать набор запросов только по тем значениям, которые я хотел вернуть. Однако это не удалось.

У кого-нибудь есть идеи?

class PointTransactionFormset(BaseInlineFormSet):
    def get_queryset(self):
        qs = super(PointTransactionFormset, self).get_queryset()
        qs = qs.filter(description="promotion feedback")
        qs = qs.values('description','points_type') # this does not work
        return qs

class PointTransactionInline(admin.TabularInline):
    model = PointTransaction
    #formset = points_formset()
    #formset = inlineformset_factory(UserProfile,PointTransaction)
    formset = PointTransactionFormset

Ответы [ 3 ]

12 голосов
/ 26 января 2011

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

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6)

Это позволяет вам выполнить всю проверку формы, исключая ее и т. Д. На уровне модели, и заставить фабрику повторить ее.

6 голосов
/ 07 марта 2009

Это форма для использования в админке? Если это так, просто установите " exclude = ['field1', 'field2']" в InlineModelAdmin, чтобы исключить поля. Чтобы показать значения некоторых полей не редактируемыми, вам нужно создать простой пользовательский виджет, метод render () которого просто возвращает значение, а затем переопределить метод formfield_for_dbfield (), чтобы назначить ваш виджет соответствующим полям.

Если это не для администратора, а для набора форм для использования в других местах, то вы должны выполнить вышеуказанные настройки (исключить атрибут во внутреннем классе Meta, переопределить виджет в методе __init__) в подклассе ModelForm, который вы передаете в набор форм конструктор. (Если вы используете Django 1.2 или более поздней версии, вы можете просто использовать readonly_fields ).

Я могу обновить примеры кода, если вы уточните, в какой ситуации вы находитесь (администратор или нет).

2 голосов
/ 09 сентября 2009

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

factory = inlineformset_factory(UserProfile, PointTransaction, 
                formset=PointTransactionFormset,
                fields=('description','points_type'))
formset = factory(instance=user_profile, data=request.POST)

, где user_profile - это UserProfile.

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

...