Передача экземпляра / значения по умолчанию в ModelFormSet для использования пустых форм в представлении - PullRequest
2 голосов
/ 11 августа 2010

Как предварительно заполнить поля , исключая в ModelFormSet. Приведенный ниже AuthorFormSet не принимает аргумент instance , только набор запросов. Итак, как мне заставить входящие пустые формы не иметь атрибут NULL / None user . Я хочу иметь возможность установить это пользовательское поле на request.user

models.py

class Author(models.Model):
    user = models.ForeignKey(User, related_name='author')
    # assume some other fields here, but not relevant to the discussion.

forms.py

 class AuthorForm(forms.ModelForm):
     class Meta:
         model = Author

 class BaseAuthorFormSet(BaseModelFormSet):
     """will do some clean() here"""
     pass

 AuthorFormSet = modelformset_factory(Author,\
                                    form=AuthorForm, \
                                    formset=BaseAuthorFormSet, extra=1,\
                                    exclude=('user',)
                                    )

views.py

def my_view(request):
    if request.method == 'POST':
        formset = AuthorFormSet(request.POST)
        if form.is_valid(): 
            form.save() # This will cause problems
                        # for the empty form i added,
                       # since user can't  be null.

EDIT

Это то, что я закончил делать, на мой взгляд. Ответ Вогана частично верен, я думаю, что он пропускает итерации по всем формам.

for form in formset.forms: 
    form.instance.user = request.user
formset.save()

1 Ответ

1 голос
/ 11 августа 2010

Вы можете исключить поля в форме модели, затем они будут исключены из набора форм, созданного modelformset_factory.

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author
        exclude = ('user',)

По вашему мнению, передайте commit=False методу save() формы, а затем установите поле пользователя вручную:

def my_view(request):
    if request.method == 'POST':
        formset = AuthorFormSet(request.POST)
        if formset.is_valid(): 
            for author in formset.save(commit=False):
                author.user = request.user
                author.save()
            formset.save_m2m() # if your model has many to many relationships you need to call this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...