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.
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 userEste 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
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")