2016-10-11 1 views
1

Mon problème: UpdateView créer nouvel objet au lieu de la mise à jour précédente, je pense que ce qui se passe parce que dans la définition de la classe de mon point de vue j'Override get_object méthode comme ceci:Django UpdateView créer un nouvel objet

def get_object(self, queryset=None): 
    try: 
     object_get = self.model.objects.get(pk=self.kwargs['pk']) 
    except ObjectDoesNotExist: 
     raise Http404("No object found matching this query") 

    if self.request.user.is_authenticated(): 
     if object_get.owner == self.request.user: 
      return object_get 

Et si le courant utilisateur n'est pas propriétaire de l'objet - ce retour de la méthode rien - ce que je voulais, mais ma classe de formulaire créer un nouvel objet:

class ClientCreation(forms.ModelForm): 

    class Meta: 
     model = Client 
     fields = ('name', 'loyal') 

Je pense que cela est arrivé parce que la forme ne reçoit pas de self.instance et créer de nouveaux à la place - quoi sho uld je fais dans cette situation? Je ne veux pas que de nouveaux objets soient créés, dans le cas où le propriétaire de l'objet n'est pas l'utilisateur actuel, je ne veux rien avoir à faire alors envoyer une telle demande de publication. Comment dois-je correctement mettre en œuvre cela?

MISE À JOUR views.py:

class Distinct(generic.UpdateView): 
    def get_object(self, queryset=None): 
     try: 
      object_get = self.model.objects.get(pk=self.kwargs['pk']) 
     except ObjectDoesNotExist: 
      raise Http404("No object found matching this query") 

     if self.request.user.is_authenticated(): 
      if object_get.owner == self.request.user: 
       return object_get 

    def get_form_kwargs(self): 
     kwargs = super(Distinct, self).get_form_kwargs() 
     if self.request.user.is_authenticated(): 
      kwargs.update({'user': self.request.user}) 
     return kwargs 

    def post(self, request, *args, **kwargs): 
     if request.POST.get('action', '') == 'Delete': 
      object_get = self.get_object() 
      request.session['deleted_data'] = str(object_get) 
      object_get.delete() 
      return redirect(reverse('crm:main')) 
     else: 
      return super(Distinct, self).post(request, *args, **kwargs) 

    def get_success_url(self): 
     return reverse('crm:{}'.format(self.distinct_template), kwargs={'pk': self.kwargs['pk']}) 

class DistinctClient(Distinct): 

    form_class = ClientCreation 
    model = Client 
    template_name = 'crm/client_detail.html' 
    all_template = 'clients' 
    distinct_template = 'client' 

    def get_form_kwargs(self): 

     return generic.UpdateView.get_form_kwargs(self) 
+2

Ensuite, vous pouvez aussi une erreur 404 lorsque le onwer n'est pas l'utilisateur actuel, ou non? –

+0

pourriez-vous s'il vous plaît fournir le code de classe complète? –

+0

@MosesKoledoye je ne veux pas soulever aucune erreur j'ai un bon message sur mon modèle, puis il ne reçoit pas un objet – Vova

Répondre

3

En UpdateView, si get_object retours None django vont créer une nouvelle object.So au lieu de retour None faire ce que vous voulez.

def get_object(self, queryset=None): 
    try: 
     object_get = self.model.objects.get(pk=self.kwargs['pk']) 
    except ObjectDoesNotExist: 
     raise Http404("No object found matching this query") 

    if self.request.user.is_authenticated(): 
     if object_get.owner == self.request.user: 
      return object_get 
    raise My #do something here. 

MISE À JOUR

class My(Exception): 
    pass 
class DistinctClient(Distinct): 

    form_class = ClientCreation 
    model = Client 
    template_name = 'crm/client_detail.html' 
    all_template = 'clients' 
    distinct_template = 'client' 

    def dispatch(self, *args, **kwargs): 
     try: 
      return super(DistinctClient, self).dispatch(*args, **kwargs) 
     except My: 
      return redirect #to do or (return render(self.request, 'mytemplate.html', {})) 
+0

Quelle exception je devrais augmenter afin d'être en mesure d'envoyer mon modèle à l'utilisateur, j'essaie d'augmenter PermissionDenied mais dans ce cas Je viens d'obtenir

403 Interdit

pas ma page tempérée – Vova

+0

j'ai mis à jour la réponse. check it – itzMEonTV

+0

Merci - ce qui fonctionne, mais je pense qu'il devrait être de retour super (DistinctClient, self) .dispatch (* args, ** kwargs) au lieu de simplement super (DistinctClient, self) .dispatch (* args, ** kwargs) parce que sans le retour, j'ai eu une erreur. – Vova