Я получаю ошибку, объект '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
.