ModelFormSet 知识点总结
1、使用ModelFormSet,一般都要设定default数,方法如下
class Memo(models.Model): title = models.CharField('タイトル', max_length=20) text = models.TextField('内容')
class MemoForm(ModelForm): class Meta: model = Memo fields = ('title', 'text')
from django.forms import ModelForm, BaseModelFormSet, modelformset_factory from apps.memo.models import Memo class BaseMemoFormSet(BaseModelFormSet): def __init__(self, *args, **kwargs): # MemoView传参 title = kwargs.pop('title') super().__init__(*args, **kwargs) # 初期値设定 self.queryset = Memo.objects.filter(title__startswith=title) MemoFormSet = modelformset_factory(Memo, Form=MemoForm, formset=BaseMemoFormSet)
其他的定义方式如下:PostCreateFormSet = modelformset_factory( Post, form=PostCreateForm, extra=1, max_num=5)
AuthorFormSet = modelformset_factory(Author, queryset=..., fields=('name', 'title'))
控制显示那些字段,在modelForm中定义无效,需要在factory生成modelset时候定义?需要确认
view中,使用modelFormSet时候,传递title参数
class MemoView(TemplateView): model = Memo template_name = "memo/template.html" def get_context_data(self, *args, **kwargs, request) context = super().get_context_data(self, *args, **kwargs, request) # 向MemoFormSet传递title参数 context['formset'] = MemoFormSet('title'='test') return context
fomset在template的显示
<form action="" method="post"> {% for form in formset %} {{ form.id }} 这是必须的 <div class="row"> <div class="col-sm-3"> {{ form.title1 }} {{ form.title1.errors }} </div> <div class="col-sm-3"> {{ form.title4 }} {{ form.title4.errors }} </div> </div> {% endfor %} {{ formset.management_form }} {% csrf_token %} <button type="submit" class="btn btn-primary">送信</button> </form>
{% csrf_token %} {{ formset.management_form }} {% for field in formset %} <!-- instance情報が隠れているので追加する必要がある --> {% for hidden in field.hidden_fields %} {{ hidden }} {% endfor %} <!-- ここまで --> {{ field.name }} <!-- 他の項目 --> {% endfor %} 或者 {% csrf_token %} {{ formset.management_form }} {% for field in formset %} <!-- instance情報が隠れているので追加する必要がある --> {{ field.id }} <!-- ここまで --> {{ field.name }} <!-- 他の項目 --> {% endfor %}
modelFormset的讲解
https://blog.csdn.net/weixin_42134789/article/details/81505983