2009-05-22 2 views
0

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

Я хочу построить модель formset из этого, с некоторыми оговорками:

  • QuerySet для formset должен быть обычай один (скажем, order_by («поле»)), а не все()
  • Поскольку locid для MyModel является AutoField и, таким образом, скрыт по умолчанию, я хочу показать его пользователю.

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

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

Приведенное выше дает мне 3 поля, но местоположение скрыто.

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.

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


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

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

ответ

2

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

Это, как вы установили пользовательские QuerySet для formset:

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) 

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

MyModelFormSet = modelformset_factory(MyModel, formset=OrderedFormSet) 
+0

Хм, потребность в такой форме, что я хочу, чтобы иметь возможность по крайней мере _show_ пользователю locid (даже если он скрыт и не может быть изменен). Что бы вы предложили как лучший способ сделать это? – viksit

0

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

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

+0

На самом деле, это не зависит от интерфейса django-admin - я полагаю, вы имеете в виду сервер, а не библиотеки? – viksit

Смежные вопросы