Ограничить inlineformset_factory Django, чтобы создавать только новые объекты - PullRequest
8 голосов
/ 01 марта 2010

Я использую фабрику встроенных форм django. Чтобы использовать пример в документах,

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

создаст встроенный набор форм для редактирования книг определенного автора.

Я хочу создать набор форм, который позволяет пользователям добавлять новых книг этого автора, но не редактировать существующие. Есть ли простой способ использовать inlineformset_factory для этого?

Ответы [ 3 ]

6 голосов
/ 01 марта 2011

inlineformset_factory принимает набор форм kwarg, который по умолчанию равен BaseInlineFormSet. BaseInlineFormSet подклассы BaseModelFormSet, который определяет метод get_queryset. Если вы создадите подкласс BaseInlineFormSet и переопределите get_queryset для возврата EmptyQuerySet (), вы должны получить то, что вам нужно. Тогда в приведенном выше примере это будет выглядеть так:

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)
2 голосов
/ 06 декабря 2013

На основании данных Джереми Льюиса и если вы не хотите создавать подкласс BaseInlineFormSet, вы можете просто передать пустой параметр набора запросов в BookFormSet.

См. Псевдо (непроверенный) пример кода Django 1.6:

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 голосов
/ 10 мая 2011

На самом деле ответ дан в документации . Только не давайте никаких примеров FormSet. Из документа:

>>> 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

Затем вы можете создать представление следующим образом:

* +1007 *

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...