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

 

posted @ 2023-07-10 10:16  花生与酒  阅读(29)  评论(0编辑  收藏  举报