2012-07-03 4 views
5

Я использую фабрику modelformset для создания набора форм из полей модели. Здесь я хочу сделать только объекты запроса как readonly и другие (дополнительные формы) как поля без вводаReadonly fields in django formset

Как я могу достичь этого?

AuthotFormSet = modelformset_factory(Author, extra=2,) 
    formset = AuthorFormSet(queryset=Author.objects.all()) 

В Над formset я хотел, чтобы отобразить все объекты QuerySet как неизменяемые, а остальные дополнительные формы как номера только для чтения полей. Как я могу добиться этого?

, если я использовал,

 for form in formset.forms: 
      form.fields['weight'].widget.attrs['readonly'] = True 

Это будет преобразовывать все формы (в том числе дополнительных) полей ReadOnly, которые я не хочу. А также я использую плагин jquery для динамического добавления формы в набор форм

ответ

7

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

#forms.py 
class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 
     if self.instance.id: 
      self.fields['weight'].widget.attrs['readonly'] = True 

#views.py 
AuthorFormSet = modelformset_factory(Author, extra=2, form=AuthorForm) 
+0

Мой вопрос заключается в том, как я могу создавать только формы запроса для чтения, а не дополнительные формы. Ваше решение преобразует все поля формы, так как readonly включает дополнительные поля. Здесь, как я могу сделать дополнительные поля формы как неточно, а другие нужно читать только – Asif

+0

проверить инструкцию if в моем отредактированном ответе. Я не уверен, что это самый чистый способ проверить, имеет ли форма связанный с ним экземпляр, но он работает в моем тестировании. –

+0

Большое спасибо, что решает мою проблему. – Asif

1

Я использовал python long back. Надежда this helps. Но если вы хотите контролировать поля отображать с помощью Jquery

$('.class').attr('readonly', true); 

или

$('#id').attr('readonly', true);