@Enter_a_nickname

Почему request.user не работает с formset?

Мне необходимо связать данные добавленные через формы с пользователями, все формы отрабатывают корректно за исключением formset.
мой forms.py:
class ColorForms(ModelForm):
    class Meta:
        model = Color
        fields = ['temp', 'correct', 'top', 'bottom']
        widgets = {
            'temp': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'temp'
            }),
            'correct': NullBooleanSelect(attrs={
                'class': 'form-control',
                'placeholder': 'correct'
            }),
            'top': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'top'
            }),
            'bottom': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'bottom'
            }),
        }

    class SpeedsForms(ModelForm):
    class Meta:
        model = Speed
        fields = ['start',  'end']
        widgets = {
            "start": TimeInput(attrs={
                'class': 'form-control',
                'placeholder': "start"
            }),
            "end": TimeInput(attrs={
                'class': 'form-control',
                'placeholder': "end"
            })
        }

    DogFormSet = modelformset_factory(
    Dog, fields=('name', 'number', 'Speed', 'DataTime'), extra=1
)

    class DogRequestsForm(ModelForm):
    class Meta:
        model = DogRequest
        fields = ['id_name', 'Color', 'Dog']
        widgets = {
            'id_name': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'id_name'
            }),
            'Color': SelectMultiple(attrs={
                'class': 'form-control',
                'placeholder': 'Color'
            }),
            'Dog': SelectMultiple(attrs={
                'class': 'form-control',
                'placeholder': 'Dog'
            }),
        }


from .forms import DogFormSet 

    def dog(request):
    formset = DogFormSet (queryset=dog.objects.none())

    if request.method == 'POST' and 'speed' in request.POST:
        form2 = SpeedsForms(request.POST)
        if form2.is_valid():
            post = form2.save(commit=False)
            post.author = request.user
            post.save()

    if request.method == 'POST' and 'dogs' in request.POST:
        formset = DogFormSet(request.POST)
        if formset.is_valid():
            post = formset.save(commit=False)
            post.author = request.user
            post.save()

    if request.method == 'POST' and 'color' in request.POST:
        form4 = ColorForms(request.POST)
        if form4.is_valid():
            post = form4.save(commit=False)
            post.author = request.user
            post.save()

    if request.method == 'POST' and 'Req' in request.POST:
        form5 = DogRequestsForm(request.POST)
        if form5.is_valid():
            post = form5.save(commit=False)
            post.author = request.user
            post.save()

    form2 = SpeedsForms()
    form4 = ColorForms()
    form5 = DogRequestsForm()
    data = {
        'form2': form2,
        'formset': formset,
        'form4': form4,
        'form5': form5,
    }

    return render(request, 'main/dogsform.html', data)


При добавлении данных через форму (ключ 'formset') я получаю ошибку:
"post.author = request.user
AttributeError: 'list' object has no attribute 'author'" с ссылкой на строку post.author = request.user в formset.
При этом если я добавлю данный атрибут в
"DogFormSet = modelformset_factory(
Dog, fields=('author', 'name', 'number', 'Speed', 'DataTime'), extra=1)"
ошибка пропадает, но запись в бд не происходит. Django возвращает мне код "200 7978".
Что нужно исправить, чтобы при заполнении данной формы все работало корректно?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
AlexNest
@AlexNest
Работаю с Python/Django
В первую очередь, подучить python.
AttributeError: 'list' object has no attribute 'author'

Тут явно сказано, что у объекта типа "список" нет атрибута "автор". Если бы вы разбирались в питоне, то даже не обращая внимания на название "modelformset_factory" (которое как бы уже само намекает, что возвращает set - набор), что save() вернул не экземпляр модели, с которым можно работать, а собственно список, который нужно проитерировать, как минимум.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы