Я получаю ошибку, объект 'QueryDict' не имеет атрибута 'user'

Я сделал форму для хранения отзывов клиентов, она работает нормально. Теперь я хочу создать форму для обновления отзывов, чтобы пользователь мог обновлять свои отзывы. Я также создал форму обратной связи, но она не работает идеально. Она показывает ошибку😢. Пожалуйста, проверьте вид UpdateFeedback. Где на самом деле возникла проблема? Пожалуйста, дайте мне соответствующее решение...

views.py:

Отлично работает, сделано для хранения отзывов.

def feedBack(request,quick_view_id):
    quick_view = get_object_or_404(Products, pk=quick_view_id)
    if request.method == "POST" and request.user.is_authenticated:

        try:
            ProductREVIEWS.objects.create(
                user=request.user,
                product=quick_view,
                feedBACK=request.POST.get('feedBACK'),
            )
            messages.success(request,"Thanks for your feedback.")
            return redirect('quick_view', quick_view_id)
        except:
            return redirect('quick_view', quick_view_id)

    else:
        return redirect('quick_view', quick_view_id)

но проблема здесь. Она не работает идеально.

def UpdateFeedback(request, id):
    feedback = ProductREVIEWS.objects.get(pk=id)
    product_id = feedback.product.id
    reviewers = feedback.user
    
    if request.method == "POST":
        form = UpdateFeedback(request.POST)

        if form.is_valid() and reviewers.id == request.user.id:
            UpdateFeedback(request.POST)
            feedBACK = form.cleaned_data.get('UpdateFeedBACK')
            feedback.feedBACK = feedBACK
            feedback.save()
            messages.success(request, "Comment updated")
    
    return redirect('quick_view', product_id)

forms.py for UpdateFeedback:

class UpdateFeedback(forms.ModelForm):

    class Meta:
        model = ProductREVIEWS
        fields = ('feedBACK')
       
        labels = {
            'feedBACK':'Change Your View'
        }

        widgets = {
            'rating':forms.NumberInput(attrs={'class':'form-control', 'style':'font-size:13px;'}),
            'feedBACK':forms.Textarea(attrs={'class':'form-control', 'style':'font-size:13px;'})
        }

models.py:

class ProductREVIEWS(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userREVIEW',on_delete=models.CASCADE)
    product = models.ForeignKey(Products, related_name='productREVIEWrelatedNAME',on_delete=models.CASCADE)
    feedBACK = models.TextField(blank=True, null=True)

urls.py:

path("feedBack/<int:quick_view_id>/", views.feedBack, name="feedBack"),
path("UpdateFeedback/<int:id>/", views.UpdateFeedback, name="UpdateFeedback")

Шаблон:

{% for feedBack in AllProductFeedback %}
<form action="{% url 'UpdateFeedback' id=feedBack.id %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}

    <textarea id="UpdateFeedBack" rows="6" style="font-size: 13px;" class="form-control" name="UpdateFeedBACK" value="" required>{{feedBack.feedBACK}}</textarea>

</form>
{% endfor %}

error:

AttributeError at /UpdateFeedback/29/
'QueryDict' object has no attribute 'user'
Request Method: POST
Request URL:    http://127.0.0.1:8000/UpdateFeedback/29/
Django Version: 4.0.4
Exception Type: AttributeError
Exception Value:    
'QueryDict' object has no attribute 'user'
Exception Location: D:\1_WebDevelopment\17_Ecomerce Website\ecomerce site\env\lib\site-packages\django\contrib\auth\decorators.py, line 22, in _wrapped_view
Python Executable:  D:\1_WebDevelopment\17_Ecomerce Website\ecomerce site\env\Scripts\python.exe
Python Version: 3.9.5
Python Path:    
['D:\\1_WebDevelopment\\17_Ecomerce Website\\ecomerce site',
 'c:\\users\\dcl\\appdata\\local\\programs\\python\\python39\\python39.zip',
 'c:\\users\\dcl\\appdata\\local\\programs\\python\\python39\\DLLs',
 'c:\\users\\dcl\\appdata\\local\\programs\\python\\python39\\lib',
 'c:\\users\\dcl\\appdata\\local\\programs\\python\\python39',
 'D:\\1_WebDevelopment\\17_Ecomerce Website\\ecomerce site\\env',
 'D:\\1_WebDevelopment\\17_Ecomerce Website\\ecomerce '
 'site\\env\\lib\\site-packages']
Server time:    Tue, 19 Jul 2022 15:54:42 +0000

У вас есть конфликт имен между вашим представлением и вашей формой - оба называются UpdateFeedback. Поэтому ваше представление пытается вызвать само представление - вы передаете request.POST в представление, которое думает, что это просто request - затем оно пытается вызвать request.user, но request на самом деле является request.POST querydict, у которого нет пользователя. Вы должны изменить имя вашей формы на UpdateFeedbackForm в ваших forms.py и views.py.

Вернуться на верх