Пожалуйста, мне нужно исправить ошибку 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>

Есть много мелких ошибок, таких как:

  1. Маршрут должен быть billing_address/<int:pk>/, а не <int:pk>billing_address/.

  2. В представлении 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.

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