Пожалуйста, мне нужно исправить ошибку AttributeError, пожалуйста, помогите мне.
Я создал проект адреса в моем проекте Django, который работает нормально, но я хочу, чтобы программа не позволяла пользователям просматривать их адрес для выставления счетов и страницу обновления адреса, если они еще не создали адрес.
Вот представления кода, который работает хорошо:
views.py
def register_address(request):
instance = ""
try:
if request.method == "POST":
form = AddressForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
messages.success(request, "You have successfully added a shipping address!")
return redirect('address:billing_address')
except:
pass
return render(request,'address/register_address.html',{'form':form})
def billing_address(request):
address = ""
try:
address = UserAddress.objects.get(user=request.user)
except:
pass
return render(request,'address/billing_address.html',{'form':address})
def update_address(request):
form = UpdateForm()
try:
if request.method == "POST":
form = UpdateForm(request.POST)
if form.is_valid():
address = UserAddress.objects.get(user=request.user)
address.user = request.user
address.country = request.POST.get("country")
address.state = request.POST.get("state")
address.area = request.POST.get("area")
address.city = request.POST.get("city")
address.street_name = request.POST.get("street_name")
address.save()
messages.error(request, "You have successfully updated address.")
return redirect('address:billing_address')
except:
pass
return render(request,'address/update_address.html',{'form':form})
urls.py
urlpatterns = [
path('register_address/',views.register_address,name="register_address"),
path('billing_address/',views.billing_address,name="billing_address"),
path('update_address/',views.update_address,name="update_address"),
]
register_address.html
<h2>Register Adress</h2><br>
<form action="" method="POST" onsubmit="myButton.disabled = true; return true;">
{% csrf_token %}
{{form.as_p}}
<input type="submit" class="btn btn-success" name="myButton" value="Submit">
</form><br><br>
<button class="btn btn-primary" onClick = "window.location= '{% url 'address:bi lling_address'%}';">View Billing Address</button> <button class="btn btn-secondary" onClick = "window.location= '{% url 'address:update_address' %}';">Update Address</button><br><br>
</div>
billing_address.html
<br><h1><center>Billing Address page!</center></h1><br>
<div class="container">
<h2>Username:</h2> {{form.user|capfirst}}<br>
<h2>Address:</h2> {{form.street_name|capfirst}}, {{form.area|capfirst}}, {{form.city|capfirst}}, {{form.state|capfirst}}, {{form.country|capfirst}}<br><br>
<button class="btn btn-success" onClick = "window.location= '{% url 'address:update_address' %}';">Edit me</button><br><br><br>
Но вот расширение кода, которое мне нужно, чтобы пользователи не могли просматривать свой адрес выставления счетов и обновлять адрес, пока они не создадут адрес.
views.py
def register_address(request):
instance = ""
user = ""
try:
form = AddressForm()
if request.method == "POST":
form = AddressForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
user = UserAddress.objects.get(user=instance.user)
messages.success(request, "You have successfully added a shipping address!")
return reverse('address:billing_address',args=[user.pk])
try:
user = UserAddress.objects.get(user=request.user)
if user is not None:
return reverse('address:billing_address',args=[user.pk])
except:
pass
except:
pass
return render(request,'address/register_address.html',{'form':form,'pk':user})
def billing_address(request,pk):
user = ""
try:
user = UserAddress.objects.get(pk=pk)
if user is not None:
return user
except AttributeError:
messages.error(request, "Please, create an address before viewing address!")
return redirect('address:register_address')
except:
messages.error(request, "Please, create an address before viewing address!")
return redirect('address:register_address')
return render(request,'address/billing_address.html',{'form':user})
urls.py
urlpatterns = [
path('register_address/',views.register_address,name="register_address"),
path('<int:pk>billing_address/',views.billing_address,name="billing_address"),
path('update_address/',views.update_address,name="update_address"),
]
register_addres.html
<h2>Register Adress</h2><br>
<form action="" method="POST" onsubmit="myButton.disabled = true; return true;">
{% csrf_token %}
{{form.as_p}}
<input type="submit" class="btn btn-success" name="myButton" value="Submit">
</form><br><br>
<button class="btn btn-primary" onClick = "window.location= '{% url 'address:billing_address' pk=user.pk %}';">View Billing Address</button> <button class="btn btn-secondary" onClick = "window.location= '{% url 'address:update_address' %}';">Update Address</button><br><br>
billing_address.html
<div class="container">
<h2>Username:</h2> {{form.user|capfirst}}<br>
<h2>Address:</h2> {{form.street_name|capfirst}}, {{form.area|capfirst}}, {{form.city|capfirst}}, {{form.state|capfirst}}, {{form.country|capfirst}}<br><br>
<button class="btn btn-success" onClick = "window.location= '{% url 'address:update_address' %}';">Edit me</button><br><br><br>
</div>
Есть много мелких ошибок, таких как:
Маршрут должен быть
billing_address/<int:pk>/
, а не<int:pk>billing_address/
.В представлении
register_address
,pk
является пустой строкой в случае запросаGET
, так как же вы можете отправить пустую строку в представлениеbilling_address
, если это текущий зарегистрированный пользователь (предполагая, что у вас уже есть связь со встроенной моделью User в Django через ForeignKey, AbstractUser или AbstractBaseUser или что-нибудь еще), так что вы можете просто отправитьrequest.user.id
в представлениеbilling_address
.
Попробуйте использовать приведенный ниже код.
urls.py:
urlpatterns = [
path('register_address/',views.register_address,name="register_address"),
path('billing_address/<int:pk>/',views.billing_address,name="billing_address"),
path('update_address/',views.update_address,name="update_address"),
]
register_address.html
<form method="POST" onsubmit="myButton.disabled = true; return true;">
{% csrf_token %}
{{form.as_p}}
<input type="submit" class="btn btn-success" name="myButton" value="Submit">
</form><br><br>
<button class="btn btn-primary" onClick = "window.location= '{% url 'address:billing_address' pk=request.user.id %}';">View Billing Address</button>
Представление всегда должно возвращать HttpResponse(…)
[Django-doc] или один из его подклассов, но вы возвращаете строку из представления, т.е. return reverse('address:billing_address',args=[user.pk])
будет возвращать строку. Поэтому верните объект ответа вместо строки в представлении как
from django.urls import reverse
from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse('address:billing_address', args=[user.pk]))
Измените соответствующим образом и в других return reverse
.