2016-10-11 4 views
1

Mein Problem: UpdateView neues Objekt erstellen, anstatt vorherige aktualisieren, ich glaube, seine geschieht, weil in Klassendefinition meiner Ansicht i Methode wie folgt außer Kraft setzen get_object:Django UpdateView erstellen neues Objekt

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 

Und so, wenn Strom Benutzer ist nicht Eigentümer des Objekts - diese Methode Rückkehr nichts - sein, was ich wollte, aber meine Form Klasse statt neues Objekt erstellen:

class ClientCreation(forms.ModelForm): 

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

ich denke, das passiert ist, weil Form erhält keine self.instance und erstelle stattdessen neues - was sho Was mache ich in dieser Situation? Ich möchte nicht, dass ein neues Objekt erstellt wird, wenn der Eigentümer des Objekts nicht der aktuelle Benutzer ist, möchte ich nichts passieren und dann eine solche Anfrage senden. Wie soll ich das richtig umsetzen?

UPDATE 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

Dann könnten Sie auch ein 404 erhöhen, wenn der onwer nicht der aktuelle Benutzer ist, oder nicht? –

+0

Könnten Sie bitte vollständigen Klassencode angeben? –

+0

@MosesKoledoye ich möchte keinen Fehler auslösen, ich habe richtige Nachricht auf meiner Vorlage, dann erhält es kein Objekt – Vova

Antwort

3

In UpdateView, wenn get_object kehrt None django wird eine neue object.So statt Rückkehr schaffen None tun, was Sie wollen.

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. 

UPDATE

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

Welche Ausnahme sollte ich steigen, um in der Lage zu sein, meine Vorlage an den Benutzer senden, ich versuche, PermissionDenied aber in diesem Fall zu erhöhen Ich bekomme nur

403 Forbidden

nicht meine temporäre Seite – Vova

+0

ich aktualisierte die Antwort. überprüfen Sie es – itzMEonTV

+0

Danke - was Arbeit, aber ich denke, es sollte Rückkehr super (DistinctClient, selbst) .dispatch (* args, ** kwargs) statt nur super (DistinctClient, selbst) .dispatch (* args, ** kwargs) denn ohne die Rückkehr habe ich einen Fehler bekommen. – Vova

Verwandte Themen