2010-03-01 9 views
8

Używam fabryki inlay formsen django. Aby użyć przykładu z dokumentacji, utworzy on wbudowany zestaw formularzy do edycji książek określonego autora. Powrót na góręOgranicza inlineformset_factory Django do tworzenia tylko nowych obiektów

Chcę utworzyć zestaw formularzy, który zezwala tylko użytkownikom na dodawanie nowych książek tego autora, a nie edytowanie istniejących książek. Czy istnieje prosty sposób użycia inlineformset_factory do tego?

Odpowiedz

6

inlineformset_factory przyjmuje zestaw kwarg, który domyślnie jest BaseInlineFormSet. Podklasy BaseInlineFormSet BaseModelFormSet, który definiuje metodę get_queryset. Jeśli utworzysz podklasę BaseInlineFormSet i zastąpisz get_queryset, aby zwrócił EmptyQuerySet(), powinieneś otrzymać to, czego szukasz. W powyższym przykładzie potem, to będzie wyglądać następująco:

from django.db.models.query import EmptyQuerySet 
from django.forms.models import BaseInlineFormSet 

class BaseInlineAddOnlyFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     return EmptyQuerySet() 

author = Author.objects.get(pk=1) 
BookFormSet = inlineformset_factory(Author, Book, formset=BaseInlineAddOnlyFormSet) 
formset = BookFormSet(request.POST, instance=author) 
+1

[Docs] (https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the- queryset) wydaje się mówić, że preferowany sposób ustawienia zestawu zapytań jest nadpisywany '__init__' po wywołaniu super. Ale to nie działa dla mnie. Twoja metoda działa podobnie jak ustawienie kwarku 'queryset' przed wywołaniem super' __init__'. Dzięki. –

0

Właściwie odpowiedź jest podana w documentation. Po prostu nie dawaj żadnej instancji do FormSet. Z Doc:

>>> from django.forms.models import inlineformset_factory 
>>> BookFormSet = inlineformset_factory(Author, Book) 
>>> author = Author.objects.get(name=u'Mike Royko') 
>>> formset = BookFormSet() # This will create an empty form with your model fields 

Następnie można utworzyć widok następująco:

if request.method == "POST": 
    formset = BookFormSet(request.POST, request.FILES) 
    if formset.is_valid(): 
     formset.save() 
else: 
    formset = BookFormSet() 
return render_to_response("add_book.html", { 
    "formset": formset, 

Nadzieję, że to pomaga.

+0

To nie działa dla mnie; nadal wypełnia zestaw wszystkich "książek". django 1.4. –

1

Na podstawie Jeremy'ego Lewisa i jeśli nie chcesz podklasy BaseInlineFormSet, możesz po prostu podać pusty parametr queryset do BookFormSet.

Patrz pseudo (przetestowane) Django kod 1,6 próba:

BookFormSet = inlineformset_factory(parent=Author, model=Book) 
if request.method == "POST": 
    formset = BookFormSet(request.POST, request.FILES, instance=author) 
    if formset.is_valid(): 
     formset.save() 
else: 
    queryset = Book.objects.none() # does not allow to edit books 
    formset = BookFormSet(instance=project, initial=initial, queryset=queryset) 
return render(request, "add_book.html", { "formset": formset, }) 
+0

inlineformset_factory wymaga teraz jawnie określonego parametru "fields". Tylko aktualizacja. – Rexford

Powiązane problemy