Soy capaz de actualizar un artículo en Django

Los individuos usuarios de miplicación tienen su Bar Information creado inmediatamente después de crear sus Bares. Quiero permitirles poder actualizar su información de la barra, pero sigue devolviendo el error "Seleccionar una opción válida. Esa elección no es una de las opciones disponibles". No estoy seguro de lo que eso significa y este tipo de error es raro para mí.

vistas. py

def UpdateUserBar(request):
    user = request.user.id
    user_email = request.user.email
    bar = Bar.objects.get(user_id=user)
    form = UpdateBar(request.FILES, instance=bar)
    if request.method == 'POST':
        form = UpdateBar(request.POST, request.FILES, instance=bar)
        if form.is_valid():
            form.save()
            return redirect('/updatebar')
            messages.success(request, 'Bar Information Updated successfully')
        # else:
        #     return redirect('/dashboard')
        #     messages.error(request, 'Only Post method is accepted')
        else:
            try:
                pass
            except Exception as e:
                messages.error(request, "Unknown error"+ str(e))
                return redirect(request.path)
    else:
        form = UpdateBar(instance=bar)
    context = {"form":form, "user_email":user_email, "bar":bar}
    return render(request, "dashboard/super/landlord/update_bar.html", context)

Nota: Si uso el segundo código de bloqueo que fue comentado, sólo me redirige al dashboard y no muestra ningún error, así que no soy capaz de conocer la causa del error.

modelos. py

class Bar(models.Model):

    bar_status = (
            ("active", "active"),
            ("closed", "closed"),
            ("pending", "pending"),
        )

    user_id = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    opening_time = models.TimeField()
    closing_time = models.TimeField()
    status = models.CharField(choices=bar_status, default="pending", max_length=14)
    image = models.ImageField(upload_to='images/bars', default='images/bars/default.jpg')

    def __str__(self):
        return self.name

formas.py

class UpdateBar(ModelForm):
    class Meta:
        model = Bar
        fields = '__all__'

updatebar.html

{% csrf_token %}
{{ form.address | attr:"class:form-control" }}
{{ form.status | attr:"class:form-control" }}
{{ form.image | attr:"class:form-control" }}
{{ form.opening_time | attr:"class:form-control" }}
{{ form.closing_time | attr:"class:form-control" }}

Pregunta hecha hace 3 años, 5 meses, 0 días - Por bughunterx


3 Respuestas:

  • "Seleccione una opción válida. Esa elección no es una de las opciones disponibles." generalmente significa que un campo que tiene choices no se ha presentado correctamente con una de las opciones disponibles. En este caso, significa que algo está mal con el status, ya que este es el único campo que utiliza choices.

    Note que en class Bar Estás definiendo status dos veces; la segunda vez sobreescribirá la primera. No estoy seguro de que esto tenga que ver con el problema, pero es va a crear problemas en algún momento.

    Respondida el Dec 16, 2020 a las 09:17 - por devguru123

    Votos positivos: 0 | Votos negativos: 0

  • El error "Seleccionar una opción válida" suele ocurrir cuando el formulario incluye una lista desplegable (select input) con opciones predefinidas, y al enviar el formulario se envía una opción que no está en la lista de opciones válidas.

    En tu caso, el campo 'status' en el modelo Bar tiene opciones predefinidas con el campo choices. Sin embargo, en el formulario updatebar.html no estás mostrando esas opciones en una lista desplegable, sino como un campo de texto normal. Por eso al enviar el formulario sin una opción válida, Django muestra el error.

    Para solucionar esto, puedes modificar el campo 'status' en el formulario updatebar.html para que se muestre como una lista desplegable con las opciones válidas. Puedes hacerlo de la siguiente manera:

    html
    
    {{ form.status }}

    Con este cambio, el campo 'status' se mostrará como un select input, y se deberá seleccionar una de las opciones predefinidas en el modelo Bar al actualizar la información de la barra. De esta manera, el error "Seleccionar una opción válida" debería solucionarse.

    Respondida el Dec 17, 2020 a las 09:17 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "Seleccionar una opción válida. Esa elección no es una de las opciones disponibles" generalmente ocurre cuando intentas seleccionar un valor para un campo de opción que no está definido en las opciones disponibles.

    En tu caso, el campo status en tu modelo Bar tiene opciones definidas como:

    
    bar_status = (
        ("active", "active"),
        ("closed", "closed"),
        ("pending", "pending"),
    )
    

    Sin embargo, en tu formulario UpdateBar, no estás incluyendo estas opciones. Intenta agregar el siguiente código a tu formulario:

    
    class UpdateBar(ModelForm):
        class Meta:
            model = Bar
            fields = '__all__'
            widgets = {
                'status': forms.Select(choices=Bar.bar_status)
            }
    

    Esto agregará un widget Select al campo status, que mostrará las opciones definidas en Bar.bar_status.

    Además, en tu plantilla updatebar.html, debes asegurarte de que el campo status esté configurado correctamente. Parece que tienes varios campos ocultos que establecen valores para name y user_id, pero no veo un campo oculto para status. Agrega el siguiente campo oculto a tu plantilla:

    
    
    

    Esto asegurará que el valor actual del campo status se establezca como valor predeterminado en el formulario.

    Una vez que hayas realizado estos cambios, intenta actualizar la información de tu barra nuevamente y verifica si el error persiste.

    Respondida el Dec 17, 2020 a las 09:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0