django formset中的只读字段

时间:2012-07-03 14:46:57

标签: python django django-forms

我正在使用modelformset工厂从模型字段生成formset。在这里,我想只将queryset对象作为只读和其他(额外的形式)作为非只读字段

我怎样才能实现这个目标?

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

在上面的formset中,我希望将所有queryset对象显示为readonly,并将剩余的额外形式显示为非readonly字段。我怎么能做到这一点?

如果我使用,

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

这会将所有表单(包括额外的)字段转换为readonly,我不想要。 而且我还使用jquery插件将表单动态添加到formset

4 个答案:

答案 0 :(得分:8)

我建议指定一个用于模型的表单,在该表单中,您可以设置您想要只读的任何属性。

#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)

答案 1 :(得分:0)

我长时间使用python。希望this helps。但是如果你想使用jquery控制字段显示

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

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

答案 2 :(得分:0)

只需要检查实例是否具有ID,如下所示:
if self.instance.id

在将其设置为只读之前

答案 3 :(得分:0)

你也可以放入你的模板:

guest_list = ["Tom", "Jack", "Peter", "Roy", "Richard", "Jonathan", "Marie"]

for guest in guest_list:
    cancel = guest_list.pop()
    if len(guest_list) >= 2:
        print(f"Sorry {cancel}, but I need to cancel.")

并且不要将 readonly_field 放在 ModelForm.Meta.fields 中。