def get_formset(self, **kwargs):
"""Returns a BaseInlineFormSet class for use in admin add/change views."""
if self.exclude is None:
exclude = []
else:
exclude = list(self.exclude)
exclude.extend(self.get_readonly_fields())
if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
# Take the custom ModelForm's Meta.exclude into account only if the
# InlineModelAdmin doesn't define its own.
exclude.extend(self.form._meta.exclude)
# if exclude is an empty list we use None, since that's the actual
# default
exclude = exclude or None
can_delete = self.can_delete and self.has_delete_permission()
defaults = {
"form": self.form,
"formset": self.formset,
"fk_name": self.fk_name,
'fields': forms.ALL_FIELDS,
"exclude": exclude,
"formfield_callback": self.formfield_for_dbfield,
"extra": self.extra,
"max_num": self.max_num,
"can_delete": can_delete,
}
defaults.update(kwargs)
return inlineformset_factory(self.parent_model, self.model, **defaults)
python类inlineformset_factory()的实例源码
def projectformset(self,*args,**kwargs):
if 'initial' in kwargs:
extra = len(kwargs['initial'])
else:
extra = 0
factory = inlineformset_factory(
EditorLink,
EditorLinkProject,
form=forms.EditorLinkProjectForm,
can_delete=False,
extra=extra
)
return factory(*args,**kwargs)
def agent_associations(request, agent_id):
agent = get_object_or_404(EconomicAgent, pk=agent_id)
HasAssociatesFormSet = inlineformset_factory(
EconomicAgent,
AgentAssociation,
fk_name = "has_associate",
form=HasAssociateForm,
extra=3,
)
has_associates_formset = HasAssociatesFormSet(
instance=agent,
queryset=agent.all_has_associates(),
prefix = "has",
data=request.POST or None)
IsAssociatesFormSet = inlineformset_factory(
EconomicAgent,
AgentAssociation,
fk_name = "is_associate",
form=IsAssociateForm,
extra=3,
)
is_associates_formset = IsAssociatesFormSet(
instance=agent,
queryset=agent.all_is_associates(),
prefix = "is",
data=request.POST or None)
if request.method == "POST":
#import pdb; pdb.set_trace()
keep_going = request.POST.get("keep-going")
just_save = request.POST.get("save")
for form in has_associates_formset:
if form.is_valid():
deleteme = form.cleaned_data['DELETE']
if deleteme:
association = form.save(commit=False)
if association.id:
association.delete()
else:
form.save()
for form in is_associates_formset:
if form.is_valid():
deleteme = form.cleaned_data['DELETE']
if deleteme:
association = form.save(commit=False)
if association.id:
association.delete()
else:
form.save()
if just_save:
return HttpResponseRedirect('/%s/%s/'
% ('accounting/agent', agent.id))
elif keep_going:
return HttpResponseRedirect('/%s/%s/'
% ('accounting/agent-associations', agent.id))
return render_to_response("valueaccounting/agent_associations.html", {
"agent": agent,
"has_associates_formset": has_associates_formset,
"is_associates_formset": is_associates_formset,
"help": get_help("associations"),
}, context_instance=RequestContext(request))
def update_concept(request, pk):
concept = Concept.objects.get(pk=pk)
AlternatesFormSet = inlineformset_factory( Concept, Alternate, can_delete=True, exclude=() )
MispellingsFormSet = inlineformset_factory( Concept, Hidden, can_delete=True, exclude=() )
TagsFormSet = inlineformset_factory( Concept, ConceptTag, can_delete=True, exclude=() )
BroaderFormSet = inlineformset_factory( Concept, Broader, fk_name='concept', can_delete=True, exclude=() )
NarrowerFormSet = inlineformset_factory( Concept, Narrower, fk_name='concept', can_delete=True, exclude=() )
RelatedFormSet = inlineformset_factory( Concept, Related, fk_name='concept', can_delete=True, exclude=() )
if request.POST:
concept_form = ConceptForm(request.POST, request.FILES, instance=concept, prefix="concept")
alternates_formset = AlternatesFormSet(request.POST, request.FILES, instance=concept, prefix="alternates")
misspellings_formset = MispellingsFormSet(request.POST, request.FILES, instance=concept, prefix="misspellings")
tags_formset = TagsFormSet(request.POST, request.FILES, instance=concept, prefix="tags")
broader_formset = BroaderFormSet(request.POST, request.FILES, instance=concept, prefix="broader")
narrower_formset = NarrowerFormSet(request.POST, request.FILES, instance=concept, prefix="narrower")
related_formset = RelatedFormSet(request.POST, request.FILES, instance=concept, prefix="related")
if concept_form.is_valid() and alternates_formset.is_valid() and tags_formset.is_valid() and broader_formset.is_valid() and narrower_formset.is_valid() and related_formset.is_valid():
concept_form.save()
alternates_formset.save()
misspellings_formset.save()
tags_formset.save()
broader_formset.save()
narrower_formset.save()
related_formset.save()
messages.add_message( request, messages.INFO, "Saved concept \"{}\"".format(concept.prefLabel) )
# tag all docs containing concept or one of its aliases
tag_concept_and_message_stats(request=request, concept=concept)
return HttpResponseRedirect( reverse('thesaurus:detail', args=[pk])) # Redirect after POST
pass
else:
concept_form = ConceptForm(instance=concept, prefix="concept")
alternates_formset = AlternatesFormSet(instance=concept, prefix="alternates")
misspellings_formset = MispellingsFormSet(instance=concept, prefix="misspellings")
tags_formset = TagsFormSet(instance=concept, prefix="tags")
broader_formset = BroaderFormSet(instance=concept, prefix="broader")
narrower_formset = NarrowerFormSet(instance=concept, prefix="narrower")
related_formset = RelatedFormSet(instance=concept, prefix="related")
return render(request, 'thesaurus/concept_form.html',
{'form': concept_form, 'concept': concept, 'alternates_formset':alternates_formset, 'misspellings_formset':misspellings_formset, 'tags_formset':tags_formset, 'broader_formset':broader_formset, 'narrower_formset':narrower_formset, 'related_formset':related_formset } )