Editar datos de un modelos con un forms ?

1,773 views
Skip to first unread message

Jorge Cadena

unread,
Nov 13, 2012, 12:52:11 AM11/13/12
to djan...@googlegroups.com
Hola de nuevo...

según la documentación de django, para editar

# Create a form to edit an existing Article.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save()

# Create a form to edit an existing Article, but use
# POST data to populate the form.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(request.POST, instance=a)
>>> f.save()

Pero no edita solo crea uno nuevo... hay alguna manera de utilizar un mismo formulario
para editar entradas existentes en la base de datos, y de la misma manera para borrar...
hay alguna manera sin utilizar formset ?


Ramiro Morales

unread,
Nov 13, 2012, 5:07:24 AM11/13/12
to djan...@googlegroups.com
2012/11/13 Jorge Cadena <jorge....@gmail.com>
Lo que has pegado es la forma de modificar una instancia de modelo ya
existente en la BD

No debería suceder lo que nos comentas ("Pero no edita solo crea uno nuevo")
¿De qué manera los has probado?

--
Ramiro Morales

Astrock

unread,
Nov 13, 2012, 7:58:37 AM11/13/12
to djan...@googlegroups.com
Es es precisamente lo que quiero, es quizás no da muy bien los términos... lo que he intentado..
pues de todo lo que he leido.. tengo lo siguiente..

models.py
class Sip(models.Model):
    name = models.CharField(max_length = 80, unique=True, verbose_name='Extension del Usuario',
        help_text='Debe ser mayor de 3 caracteres')
    accountcode = models.CharField(max_length = 30, blank = True)

forms.py
class AgregarCuenta(forms.ModelForm):
    def clean(self):
        cd = self.cleaned_data

        name = cd.get('name')
        secret = cd.get('secret')

        if name == secret:
             raise forms.ValidationError("Extension del Usuario y Contraseña no pueden ser iguales")
        return cd

    def clean_name(self):
        cd = self.cleaned_data

        name = cd.get('name')
        if len(name) < 4:
            raise forms.ValidationError('Nombre muy Corto')


        dato = Sip.objects.get(name = name)
        if dato:
             raise forms.ValidationError('Extension se encuentra Registrada')
        return name


    def clean_secret(self):
        cd = self.cleaned_data

        secret = cd.get('secret')
        if  len(secret) < 6:
            raise forms.ValidationError('Contraseña muy corta')
        return secret

    class Meta:
        model = Sip
        fields = ('name', 'callerid','secret','host','type','context','nat','dtmfmode')

views.py
def modificar_cuenta_sip(request, id_cta):

    dato = get_object_or_404(Sip, pk=id_cta)
   
    if request.POST: # Captura de datos por POST       
        form = AgregarCuenta(request.POST, instance = dato)

        if form.is_valid():
            info_enviado = True
            form.save()

            info = "Se Agrego Correctamente"
        else:           
            info = "No se Agrego Cuenta"

        ctx = {
            'form':form,
            }
        return render_to_response('AgregarSip.html',ctx,context_instance=RequestContext(request))
    else:    # Captura de datos por GET
        form = AgregarCuenta(instance = dato)
       
        ctx = {
            'form':form,
            'action': id_cta
            }
        return render_to_response('Agregar.html',ctx,context_instance=RequestContext(request))

html.html

<form action="{{ action }}" method="POST">{% csrf_token %}                       
{{form.as_p}}
<button class="ui-state-default ui-corner-some floatRight" type="submit" value="Agregar">Agregar</button>
</form>

Con esto, lo que busco es poder modificar modificar datos previamente ingresados por otro form o el mismo, algo asi como un crud, para poder ingresar, modificar y eliminar.

pero con lo que tengo siempre se salta
raise forms.ValidationError('Extension se encuentra Registrada')

Si quito esa excepción. me sale error de que ya se encuentra registrada, si lo que busco es modificar esa misma información.


--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
Un hombre de carácter podrá ser derrotado pero jamás destruido.

ERNEST HEMINGWAY.

Hiko hitokiri

unread,
Nov 13, 2012, 11:07:50 AM11/13/12
to djan...@googlegroups.com
hum . mira donde creas los formularios no es necesaria esa validacion que has puesto como dice la documentacion.
solo necesitas enviarle una instancia de búsqueda al formulario y mandarlo a imprimir luego con un metodo post guardar los datos  ya modificados como si fuesen normales 

buscar el dato a modificar 




views.py
def modificar_cuenta_sip(request, id_cta):
a = Article.objects.get(pk=1) 
    if request.POST: # Captura de datos por POST       
        form = AgregarCuenta(request.POST, instance = a)

        if form.is_valid():
            info_enviado = True
            form.save()

            info = "Se Agrego Correctamente"
        else:           
            info = "No se Agrego Cuenta"

        ctx = {
            'form':form,
            }
        return render_to_response('AgregarSip.html',ctx,context_instance=RequestContext(request))
    else:    # Captura de datos por GET            
        form = AgregarCuenta(instance = a)

       
        ctx = {
            'form':form,
            'action': id_cta
            }
        return render_to_response('Agregar.html',ctx,context_instance=RequestContext(request))

y si quiere cambiar el dato tiene que modificar la url para que capture dijitos para cambiar el pk  de el objetoy asi puedes modificar cual es el registro que deseas  modificar ahi en la documentacion dice como se capturan esas cosas 

Ramiro Morales

unread,
Nov 13, 2012, 11:09:57 AM11/13/12
to djan...@googlegroups.com
2012/11/13 Astrock <jorge....@gmail.com>:
> Es es precisamente lo que quiero, es quizás no da muy bien los términos...
> lo que he intentado..
> pues de todo lo que he leido.. tengo lo siguiente..
>
> models.py
> class Sip(models.Model):
> name = models.CharField(max_length = 80, unique=True,
> verbose_name='Extension del Usuario',
> [...]
>
> forms.py
> class AgregarCuenta(forms.ModelForm):
> ...
> def clean_name(self):
> ...
> dato = Sip.objects.get(name = name)
> if dato:
> raise forms.ValidationError('Extension se encuentra
> Registrada')
> return name

Has definido el campo name con unique=True para que la BD sea la que
realice esa validación.

Lo que estás haciendo en clean _name() es precisamente evitar que se
grabe esa edición porque estás consultando al ORM si ya existe un Sip
con ese name y abortando el proceso de grabación. En el caso en el que
no estes modificando el campo name eso porque fectivamente existe la
instancia que estas modificando falla como contás que falla pero
porque es lo que has implementado.

Nos comentá que si quitás esa verificación te salta otra pero no nos
das muchos detalles.

En gral creo que el problema que estas viendo tiene que ver con las
validaciones que implementaste y sobre las que no nos habías contado
en tu post inicial y se ve que hay bastante código extra que no nos
has mostrado asi que por ahora me inclino a pensar que es un problema
con tú código.

Creo que si implementás un caso simple con un modelo y un modelform
básicos vas a ver que lo que nos reportabas inicialmente en el asunto
del email no es correcto. Sobre eso podes comenzar a mejorar tu vista
y la validación en el modelform.


--
Ramiro Morales

Carlos Aguilar

unread,
Nov 13, 2012, 11:29:38 AM11/13/12
to djan...@googlegroups.com
Algo simple para editar un registro de la base de datos:

Aclaro, el formulario no tiene validaciones personalizadas por tanto usa el método clean_xxx por default


def editar(request, id):
    message = Message.objects.get(pk=id)
    if request.method == 'POST':
        form = MessageForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')
    else:
        form = MessageForm(instance=message)
        
    data = {
        'form': form,
    }
    
    return render_to_response("add.html", data, context_instance=RequestContext(request))


2012/11/13 Ramiro Morales <cra...@gmail.com>


--
Ramiro Morales

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
Carlos Aguilar
Consultor Hardware y Software
DWD&Solutions
http://www.dwdandsolutions.com

Astrock

unread,
Nov 13, 2012, 11:37:29 AM11/13/12
to djan...@googlegroups.com

pues lo que acorte mas fue el modelo que es grande. no creí conveniente colocar todo el código por lo extenso y solo colocar lo básico. Pero con su ayuda realice lo siguiente. quite la validación


>         dato = Sip.objects.get(name = name)
>         if dato:
>              raise forms.ValidationError('
Extension se encuentra

y le quite el unique=True en el modelo.  y funciona perfectamente....

pero ahora esta el problema que se puede repetir el dato name en el modelo.. y eso es una de las reglas inmodificable para ese form.

y si creo otro, form y no le doy reglas de validación en el formulario puedo cambiar el name por uno que me paresca, y repetir uno existente.

como seria la mejor recomendación? para poder modificar un campo unique, ?





--
Ramiro Morales

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
Reply all
Reply to author
Forward
0 new messages