2011-01-12 9 views
6

Ich habe folgendes:den Benutzer machen

from django.contrib.auth.models import User 

class ClientDetails(models.Model): 
    created_by = models.ForeignKey(User) 
    ... 

Wie kann ich created_by Standard die derzeit angemeldeten Benutzer?

(Ich möchte, dies zu tun, damit ich es in der Admin-Ansicht vor allem verstecken, sondern auch, weil, wenn ich eine Instanz speichere ich will es nicht jedes Mal zu füllen)

Antwort

12

Da Sie die zur Zeit in Benutzer von einem request Objekt angemeldet erhalten möchten, können Sie es nicht in der save -Methode Modell bekommen, aber Sie können zum Beispiel überschreiben die save_model -Methode Modell Leiter:

class MyAdmin(admin.ModelAdmin): 
    def save_model(self, request, instance, form, change): 
     user = request.user 
     instance = form.save(commit=False) 
     if not change or not instance.created_by: 
      instance.created_by = user 
     instance.modified_by = user 
     instance.save() 
     form.save_m2m() 
     return instance 
+1

kann ich dies in einer meiner Admin-Ansichten einfach fallen lassen? (offensichtlich nach dem Ändern von created_by und modified_by). Gibt es eine Chance, dass du das für uns brechen kannst? – Sevenearths

+0

das ist die nützlichste Lösung, weil Sie "Anfrage" verwenden können, kann ich nicht glauben, dass ich es hier vermisste http://django.me/save_model – tutuDajuju

1

Normale modelfields a hat Standardargument Aber ForeignKeys nicht so weit ich weiß, also denke ich, dass Sie mit einem post_save Signal arbeiten müssen.

+0

+1, aber wenn ich es wäre würde ich nur die save() Funktion überschreiben :) – mouad

+0

Dann müsste ich die Admin-Standard speichern Funktion würde ich nicht überschreiben? – Sevenearths

+0

Aktuelle Versionen von Django erlauben sicherlich Standardwerte für Fremdschlüssel. Ich bin mir nicht sicher, ob sie das jemals getan haben. Wenn also jemand heute diese Antwort liest, sollte er bestenfalls als veraltet betrachtet werden. –

1

ich gefunden:

from django.db import models 
from django.contrib.auth.models import User 

class CurrentUserField(models.ForeignKey): 
    def __init__(self, **kwargs): 
     super(CurrentUserField, self).__init__(User, null=True, **kwargs) 

    def contribute_to_class(self, cls, name): 
     super(CurrentUserField, self).contribute_to_class(cls, name) 
     registry = registration.FieldRegistry() 
     registry.add_field(cls, self) 

class ClientDetails(models.Model): 
    created_by = CurrentUserField() 
... 

von here. Aber gibt es keinen einfacheren Weg?

+0

+ Ich weiß nicht, wie man "Registrierung" importiert – Sevenearths

+0

Sie sollten das Buch weiter lesen, es gibt mehr, die Sie brauchen, einschließlich der Registrierung und einer Middleware! –

+0

Ihr wahrscheinlich richtig – Sevenearths

6

Ich hatte vor kurzem ein ähnliches Problem, das aus meiner views.py Datei ist

def CircleAdd(request): 

    form = CircleAddForm(request.POST) 

    if form.is_valid(): 

     Circle = form.save(commit=False) 
     Circle.Author = request.user 
     Circle = Circle.save() 

Und dann hatte ich ein Formular für das Modell ‚Kreise‘, die nur ein Wrapper wirklich war (forms.py)

class CircleAddForm(ModelForm): 
    class Meta: 
     model = Circle 

Denken Sie daran, das Formular in Ihrer Sicht zu importieren!

Edit: nicht einmal sicher, ob Sie auch mit dem separaten Formular stören müssen, ist der Schlüssel Bit ist die Fälschung begehen, gefolgt von dem realen

+0

nicht sicher, was forms.py ist (immer noch neu zu Django) I Ich habe nur gehofft, dies in der Admin-Oberfläche zu tun – Sevenearths

+0

Ich nehme an, wenn ich es in models.py zu Standard bekommen kann, dann wird es Standard in den Admin-und Site-Ansichten sowie – Sevenearths

+0

auf Formulare jetzt und Ihre Antwort macht jetzt Sinn – Sevenearths

3

Aufbauend auf der akzeptierte Antwort, wenn Sie schauen, um dies zu tun mit Klasse Basierend Ansichten können Sie die Anweisungen in der docs, das Überschreiben der form_valid() Methode für die Klasse Ansicht folgen:

# views.py 

from django.views.generic.edit import CreateView 

class CreateClient(CreateView): 
    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     return super(CreateClient, self).form_valid(form) 
+0

Beachten Sie, dass dies nicht funktioniert, wenn das Feld ein erforderliches Feld ist. – YPCrumble

4

Sie haben get_changeform_initial_data Methode in Ihrem Modell Admin-Klasse in admin.py außer Kraft zu setzen, wie folgt:

# admin.py 

class ClientDetailsAdmin(admin.ModelAdmin): 
    def get_changeform_initial_data(self, request): 
     get_data = super(ClientDetailsAdmin, self).get_changeform_initial_data(request) 
     get_data['created_by'] = request.user.pk 
     return get_data 

admin.site.register(ClientDetails, ClientDetailsAdmin) 

Auf diese Weise erhalten Sie die eleganteste Lösung, da das Feld created_by abgelegt wird, wenn Sie einen neuen Datensatz erstellen.

Verwandte Themen