Создание набора моделей из модели - PullRequest
0 голосов
/ 22 мая 2009

У меня есть модель MyModel, которая содержит PK - locid, то есть AutoField.

Я хочу построить модельный набор форм с некоторыми оговорками:

  • Набор запросов для набора форм должен быть пользовательским (скажем, order_by ('field')), а не all ()
  • Поскольку locid для MyModel является автоматическим полем и поэтому скрыт по умолчанию, я хочу показать его пользователю.

Я не уверен, как это сделать. Я пробовал несколько подходов,

MyModelFormSet = modelformset_factory(MyModel, fields=('locid', 'name', 'dupof'))

Выше приведены три поля, но locid скрыт.

class MyModelForm(ModelForm):

  def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    self.fields['locid'].widget.attrs["type"] = 'visible'
    locid = forms.IntegerField(min_value = 1, required=True)

  class Meta:
    model = MyModel
    fields = ('locid', 'name', 'dupof')

Выше приведено сообщение об ошибке ManyToMany.

Кто-нибудь делал что-то подобное раньше?


Редактировать 2

Теперь я могу использовать пользовательский запрос при создании экземпляра набора форм, но мне все еще нужно показать поле locid пользователю, потому что идентификатор важен для использования приложения. Как бы я это сделал? Есть ли способ переопределить поведение по умолчанию для сокрытия ПК, если оно является автополем?

Ответы [ 3 ]

2 голосов
/ 22 мая 2009

Нет смысла показывать пользователю автозаполнение, так как это автоинкрементный первичный ключ - пользователь не может его изменить и он не будет доступен до сохранения записи в базе данных (где СУБД выбирает следующее доступное ID).

Вот как вы устанавливаете пользовательский набор запросов для набора форм:

from django.forms.models import BaseModelFormSet

class OrderedFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        self.queryset = MyModel.objects.order_by("field")
        super(OrderedFormSet, self).__init__(*args, **kwargs)

и затем вы используете этот набор в заводской функции:

MyModelFormSet = modelformset_factory(MyModel, formset=OrderedFormSet)
1 голос
/ 27 мая 2009

В итоге я использовал переменную на стороне шаблона, как я упоминал здесь:

Как отобразить скрытое автополе в django formset

0 голосов
/ 24 мая 2009

Если вам нравятся дешевые обходные пути, почему бы не использовать locid в методе __unicode__? Пользователь гарантированно увидит его, и никаких специальных знаний о django-admin не требуется.

Но, честно говоря, все мои ответы на вопросы, связанные с django-admin, имеют тенденцию к «не напрягайтесь, чтобы превратить django-admin в универсальный CRUD-интерфейс».

...