2010-03-01 8 views
8

Ich benutze djangos Inline-Formset-Factory. Um das Beispiel in der Dokumentation zu verwenden, erstelltBegrenzen Sie Djangos inlineformset_factory, um nur neue Objekte zu erstellen

ein Inline-Formularsatz zum Bearbeiten von Büchern durch einen bestimmten Autor.

Ich möchte ein Formularset erstellen, das nur Benutzern ermöglicht, neue Bücher von diesem Autor hinzufügen, nicht vorhandene Bücher bearbeiten. Gibt es eine einfache Möglichkeit, inlineformset_factory dafür zu verwenden?

Antwort

6

inlineformset_factory verwendet ein Formset kwarg, das standardmäßig BaseInlineFormSet verwendet. BaseInlineFormSet-Unterklassen BaseModelFormSet, das eine get_queryset-Methode definiert. Wenn Sie eine BaseInlineFormSet-Unterklasse erstellen und get_queryset überschreiben, um EmptyQuerySet() zurückzugeben, sollten Sie das bekommen, wonach Sie suchen. Im obigen Beispiel dann würde es so aussehen:

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

[Die docs] (https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the- queryset) scheint zu sagen, dass die bevorzugte Methode zum Setzen des Querysets nach dem Aufruf von super in '_____________ überschrieben wird. Aber das funktioniert nicht für mich. Ihre Methode tut dies ebenso wie das Setzen des kwarg 'querieset' vor dem Aufruf von super's' __init__'. Vielen Dank. –

0

Eigentlich ist die Antwort in den documentation gegeben. Geben Sie dem FormSet keine Instanz. Vom 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 

Anschließend können Sie wie folgt erstellen:

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, 

Hoffe, es hilft.

+0

Das funktioniert nicht für mich; Es füllt immer noch das Formset mit allen 'Book's. Django 1.4. –

1

Basierend auf Jeremy Lewis und wenn Sie BaseInlineFormSet nicht ableiten möchten, können Sie Ihrem BookFormSet einfach einen leeren queryset-Parameter geben.

Siehe pseudo (ungetestet) Django 1.6 Codebeispiel:

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 erfordert jetzt, dass der Parameter 'fields' explizit angegeben wird. Nur ein Update. – Rexford

Verwandte Themen