Python-en-equipo / MarketPlace

Aplicación web Tipo Marketplace, registro de usuarios, post y compras de usuarios y vendedores desarrollada con Django y Tailwind
11 stars 1 forks source link

El user ya puede editar su info. Revisar lógica cambiada en view user_panel y navbar #36

Open Arturomtz8 opened 2 years ago

Arturomtz8 commented 2 years ago
@login_required
def user_modify_view(request):
    try:
        instance_seller = Seller.objects.get(profile__id=request.user.id)
    except Seller.DoesNotExist:
        instance_seller = None
    user_form = UserEditForm(instance=request.user)
    seller_form = SellerForm(instance=instance_seller)
    if request.method == 'POST':
        user_form = UserEditForm(request.POST, instance=request.user)
        seller_form = SellerForm(request.POST or None, instance=instance_seller)
        if user_form.is_valid() and seller_form.is_valid():
            custom_user = user_form.save()
            seller = seller_form.save(commit=False)
            seller.profile = custom_user
            seller.save()
            return redirect("users:user_panel")
        elif user_form.is_valid():
            user_form.save()
            return redirect("users:user_panel")

    return render(request, "users/users_edit.html", {"user_form": user_form, "seller_form": seller_form})

Como no todos los usuarios tienen una tienda registrada, se checa primero si tienen tienda con:

   try:
        instance_seller = Seller.objects.get(profile__id=request.user.id)
   except Seller.DoesNotExist:
        instance_seller = None

Ahora, se poblan los forms con la data que tenemos de cada user:

user_form = UserEditForm(instance=request.user)
seller_form = SellerForm(instance=instance_seller)

El comportamiento por default de la view (al hacer un GET) es mostrar las forms:

return render(request, "users/users_edit.html", {"user_form": user_form, "seller_form": seller_form})

Si el método es post, maneja las dos posibilidades, si el usuario tiene una tienda, o si es solamente info del usuario:

if request.method == 'POST':
        user_form = UserEditForm(request.POST, instance=request.user)
        seller_form = SellerForm(request.POST or None, instance=instance_seller)
        if user_form.is_valid() and seller_form.is_valid():
            custom_user = user_form.save()
            seller = seller_form.save(commit=False)
            seller.profile = custom_user
            seller.save()
            return redirect("users:user_panel")
        elif user_form.is_valid():
            user_form.save()
            return redirect("users:user_panel")

Se creó el path en [urls.py](http://urls.py/) de users que nos lleve a la view para editar:

path("user_edit/", views.user_modify_view, name="user_edit"),

y el Html template que muestra las forms, tomé el código que Ángel hizo para editar productos, pero cuidando de ocultar el campo de Tienda en dado caso que el usuario no tenga una tienda registrada:

{% extends '../base.html' %}

{% block title %}Cambia tus datos{% endblock title %}

{% block content %}

{% if form.errors %}
{{ form.errors }} <!-- display the form errors if they exist -->
{% endif %}

<div class="m-5 mt-5 d-flex flex-wrap align-items-center justify-content-center">

    <div class="card p-5 w-50">
        <div class="card-body">
            <form method="POST" enctype="multipart/form-data">
                {% csrf_token %}
                <div class="form-outline mb-4">
                    <label class="form-label" for="id_title">Nombre</label>
                    {{ user_form.first_name }}
                </div>
                <div class="form-outline mb-4">
                    <label class="form-label" for="id_description">Apellido</label>
                    {{ user_form.last_name }}
                </div>

                <div class="form-outline mb-4">
                    <label class="form-label" for="id_price">Correo</label>
                    {{ user_form.email }}
                </div>
                {% if request.user.seller %}
                <div class="form-outline mb-4">
                    <label class="form-label" for="id_price">Nombre de tu tienda</label>
                    {{ seller_form.seller_name }}
                </div>
                {% endif %}

                <!-- Submit button -->

                <input class="btn btn-primary btn-block mb-4 d-flex justify-content-center" type="submit" value="Save" />
            </form>
        </div>

    </div>

</div>

{% endblock content %}

{% if request.user.is_authenticated and not request.user.seller %}
<span class="user-msg h6 mx-3"> Hola,<a href="{% url 'users:user_panel' %}">{{request.user.email}}</a></span>
<span class="user-msg h6 mx-3"><a href="{% url 'users:seller_register' %}">Regístrate como vendedor</a></span>
<a class="btn btn-warning m-1" href="{% url 'users:logout' %}"> Logout </a>
{% elif request.user.is_authenticated %}
<span class="user-msg h6 mx-3"> Hola,<a href="{% url 'users:user_panel' %}">{{request.user.email}}</a></span>
<a class="btn btn-warning m-1" href="{% url 'users:logout' %}"> Logout </a>
{% else %}
<a class="btn btn-outline-light me-2 m-3" href="{% url 'users:login' %}"> Login </a>
{% endif %}
@login_required
def user_panel(request):
    if hasattr(request.user, 'seller'):
        products = Product.objects.filter(seller= request.user.seller)
        ctx = {"products": products}
        return render(request, "users/user_panel.html", ctx)
    else:
        return render(request, "users/user_panel.html")

Así cualquiera podrá ver su panel, y en caso que no tenga tienda, en su panel aparecerá la opción de que se registre como vendedor:

imagen

imagen

imagen

Arturomtz8 commented 2 years ago

Mejorar la view del navbar. Porque el link que te invita a convertirte en vendedor se ve feo, igual alinear el Hola + correo de navbar porque está disparejo

Arturomtz8 commented 2 years ago

Colocar el botóon de Cancel de la view de editar los datos de usuario junto al Save, actualmente se ve así: imagen