Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

266
Vistas
¿Cómo cambia la clave principal enviada a una vista de actualización en Django?

Quiero cambiar la clave principal que se envía a la vista de actualización desde la plantilla. Dejame explicar. Aquí está mi plantilla:

 <a href="{% url 'new_url' model_instance.pk %}"> {{ model_instance.username }} </a>

Esta model_instance es una instancia en un bucle for de la variable de contexto model_instances en una vista de lista. Esta clave principal de model_instance se enviará a la siguiente vista:

 class UserUpdateView(generic.UpdateView): template_name = "leads/update.html" queryset = User.objects.all() context_object_name = "user" form_class = UserUpdateForm def get_success_url(self): return reverse("some-url")

Sin embargo, el problema es que la clave principal que estoy enviando a UserUpdateView es la clave principal para el modelo model_instance , no el modelo User . Además, no existe un vínculo como las relaciones uno a uno entre los dos modelos. Sin embargo, hay una similitud. Tanto el model_instance como el user tienen un campo de nombre de username que es el mismo.

En otras palabras, primero necesito recuperar model_instance.username y luego consultar el modelo de User para encontrar la instancia de user con el mismo nombre de username que quiero actualizar. Por el momento, UserUpdateView simplemente recibe la clave principal para un model_instance en la plantilla, que no es lo que quiero. Espero que me puedan ayudar con este problema, y por favor dejen cualquier pregunta que tengan. Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No es lo suficientemente intuitivo, pero sí es posible. También es bueno mencionar que define un queryset de conjunto de consultas en la vista, si desea actualizar solo un objeto, entonces no es necesario. Puede anular el método get_object para hacer esto:

 class UserUpdateView(generic.UpdateView): template_name = "leads/update.html" # queryset = User.objects.all() context_object_name = "user" form_class = UserUpdateForm def get_success_url(self): return reverse("some-url") def get_object(self): # Here w'll retrieve the correct object to update # First we retrieve the username of the model_instance model_instance = ModelInstance.objects.get(pk=self.kwargs['pk']) username = model_instance.username # Retrieve the username # After, retrieve the user with username=model_instance.username # Normally, the username must be unique per model_instance and per user. If not an error can be trowed. user = User.objects.get(username=username) # If username is not unique, try this approach # user = User.objects.filter(username=username).first() # Return the user object return user

Este enlace de plantilla:

 <a href="{% url 'new_url' model_instance.pk %}"> {{ model_instance.username }} </a>

ahora señalará al usuario para actualizar, no el modelo_instancia.

Más sobre get_object

over 4 years ago · Santiago Trujillo Denunciar

0

Dado que model_instance y el usuario tienen el mismo nombre de usuario, puede pasar model_instance.username al generar la URL y cambiar su UpdateView para especificar slug_field = "username" . También tendría que cambiar su urlconfig para usar "slug" en lugar de "pk" o agregar slug_url_kwarg = "pk" .

 <a href="{% url 'new_url' model_instance.username %}"> {{ model_instance.username }} </a> class UserUpdateView(generic.UpdateView): template_name = "leads/update.html" queryset = User.objects.all() context_object_name = "user" form_class = UserUpdateForm slug_field = "username" slug_url_kwarg = "pk" def get_success_url(self): return reverse("some-url")
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda