2016-05-23 8 views
0

Ich habe die folgende Klasse:Django: Detailansicht, Wo wird ein Zähler aktualisiert?

class ImageGalleryDetail(DetailView):           

    model = ImageGallery               
    template_name = 'galleries/imagegallery_detail.html'       

    def get_context_data(self, **kwargs):          
     context = super(ImageGalleryDetail, self).get_context_data(**kwargs)  
     context['image'] = self.object           
     context['gallery'] = self.object.owner_gallery       

     return context               

    def update_counter(self):                               
     self.object.hits = F('hits') + 1           
     self.object.save() 

Und wie man sehen kann ich eine Methode namens haben update_counter(), wo ich eine F expression verwendet, um atomar einen Zähler zu aktualisieren.

Meine Frage ist, wo sollte ich den Anruf zu dieser Funktion finden? So wie ich es sehe Ich könnte es in der get_context_data()-Methode finden, aber es klingt seltsam für mich, der Name der Methode beginnt mit erhalten nicht gesetzt. Und ich denke, ich sollte nicht Sachen modellbezogene dort gespart werden ...

Method Flowchart von Detailview ist die folgende (Anfänger hier!):

1. dispatch() 
2. http_method_not_allowed() 
3. get_template_names() 
4. get_slug_field() 
5. get_queryset() 
6. get_object() 
7. get_context_object_name() 
8. get_context_data() 
9. get() 
10. render_to_response() 

Also ich habe ehrlich gesagt keine Ahnung, welche Methode sollte Ich überschreibe, um update_counter Funktion zu rufen. Jede Hilfe wäre willkommen. Oder wenn das die falsche Art ist Dinge zu tun ... das würde ich auch gerne wissen! :)

+0

Sie besser dieses Zählverfahren in das Modell definieren würde sich Bilddatenbank oder einen benutzerdefinierten Manager für ihn definieren. Nur für den Fall, dass der Logic Out-of-View-Teil nicht angezeigt wird. – sheshkovsky

+0

@sheshkovsky Ich teile Ihre Gedanken dazu. Möchten Sie nur die einfachsten Beispiele, wie dies in der ImageGallery selbst gemacht wird, teilen? Ich werde das zu schätzen wissen und es als Antwort auf meine Frage akzeptieren :-) – gglasses

+0

Ich habe meine Ideen als Antwort geschrieben. Aber ich bin nicht sicher, wo Sie diese Methoden in Ihren Ansichten nennen sollten. – sheshkovsky

Antwort

0

Um die Logik aus den Sichten herauszuhalten, können Sie ein neues Integer-Feld definieren und Ihren Counterfinder als Modellmethode definieren.

class ImageGallery(models.Model): 
    ... 
    count = models.PositiveIntegerField(default=0) 

    def update_counter(self): 
     self.count = self.count + 1 

Ein anderer Weg könnte einen neuen benutzerdefinierten Manager des Hinzufügen:

class ImageGalleryManager(models.Manager): 
    def update_counter(self, pk): 
     self.filter(id=pk).update(count=F('count')+1) 

class ImageGallery(models.Model): 
    ... 
    count = models.PositiveIntegerField(default=0) 

    objects = ImageGalleryManager() 

Check out Managers offizielle Dokumentation für weitere Informationen.

+0

Ich mag die erste Methode besser, die, die Teil von ImageGallery ist. Aber wie heißt die Funktion 'update_counter'? – gglasses

+0

Rufen Sie die Methode in 'get_context_data' auf und übergeben Sie sie dann als Teil des Kontextwörterbuchs an die Vorlage, wenn Sie den Wert" count "in Ihrer Vorlage anzeigen müssen. – sheshkovsky

0

in einer Detailansicht, wenn Ihr Modell ein page_click Feld enthält

def get_context_data(self, **kwargs): 
    context = super(DetailView, self).get_context_data(**kwargs) 
    obj = self.get_object() 
    obj.page_click = obj.page_click + 1 
    obj.save() 
    return context 
Verwandte Themen