2017-07-13 5 views
1

J'ai une vue basée sur la classe ouvrière simple héritant UpdateView.Faire UpdateView accepter un pk crypté dans urls.py et retourner un objet de modèle pour l'édition après avoir déchiffré le pk

class UpdateModel(UpdateView): 
    model = ModelName 
    fields = ['field_1' , 'field_2' , ] 
    template_name_suffix = '_update_form' 
    success_url = reverse_lazy('home') 

et l'url qui associe revenir à ce point de vue

url(r'^edit/(?P<pk>[\w-]+)$' , UpdateModel.as_view() , name="update_model"), 

Maintenant la question Je suis face est que je chiffre habituellement la valeur PK avant de l'envoyer à l'extérieur (car ils sont sensible). Quand je les reçois, je les décrypte pour obtenir l'objet modèle.

Brève opération du processus de cryptage.

def pk_encoder(pk): 
    int_pk = int(pk) 
    hashids = Hashids("MySalt") 
    encoded_pk = hashids.encode(pk_id) 
    return encoded_pk 

ans que je l'utilise de la même hashids.decode ('string') pour obtenir mon modèle objet.

Mais dans UpdateView il n'y a pas de disposition pour cela (que je connais). Dans urls.py, il accepte simplement le pk id pour renvoyer le formulaire correspondant à la mise à jour d'un modèle. Je comprends que je dois redéfinir UpdateView ou l'une de ses fonctions d'une certaine façon, mais ne peux pas comprendre comment. Puis-je savoir comment modifier cette fonctionnalité de UpdateView

Merci d'avance.

Répondre

0

C'était un simple tweak. Après avoir lu le code source, here, je trouve que je devais simplement étendre les fonctionnalités de

def get_object(self)

qui est déclaré dans SingleObjectMixin (ContextMixin) classe.

Le code ressemble,

class UpdateModels(UpdateView): 
    #declare model, fields, template_name etc. 

    def get_object(self): 
     #decode and get the object in the variable desired_model_object 
     return desired_model_object 

Hope this helps quelqu'un.