2010-03-10 5 views
11

Ich möchte so etwas wie dies zu tun:So weisen Sie den aktuell angemeldeten Benutzer als Standardwert für ein Modellfeld zu?

class Task(models.Model): 
    ... 
    created_by = models.ForeignKey(User, **default=[LoggedInUser]** blank=True, null=True, related_name='created_by') 

Ist das möglich? Ich konnte nicht finden, was der richtige Weg ist, den eingeloggten Benutzer zu bekommen, abgesehen von request.user, in einer Ansicht, die hier nicht zu funktionieren scheint.

PS_ Ich weiß, dass ich die Modelldaten auf andere Weise initialisieren könnte, aber ich denke, das ist der sauberste Weg.

+0

Sorry für die Syntax highlight, aber ich wollte den Standardwert bemerken. – Nacho

Antwort

4

Nein, Sie können es nicht so machen. Django (und Python) hat ziemlich viele globale Werte null, und das ist ein gutes Ding (tm). Normalerweise erhalten Sie den aktuellen Benutzer in view(request) mit request.user. Sie können dies dann als Parameter an verschiedene Methoden/Funktionen übergeben, aber wenn Sie versuchen, einen globalen user festzulegen, führt dies nur zu Rissen in einer Multithread-Umgebung.

Es sollte einen Autoaufkleber geben, der sagt, Globals sind schlecht. Dies wird Ihnen eine gute Idee über mein Problem Nummer eins mit PHP geben.

+0

Fair genug. Ich werde sehen, ob ich es mit Signalen arbeiten kann, was ich denke, dass es der beste Weg ist, dann zu gehen. Danke – Nacho

23

Wenn Sie dies innerhalb der Admin-Oberfläche erreichen möchten, können Sie die Methode save_model verwenden. Im folgenden sehen Sie ein Beispiel:

class List(models.Model): 
    title = models.CharField(max_length=64) 
    author = models.ForeignKey(User) 

class ListAdmin(admin.ModelAdmin): 
    fields = ('title',) 
    def save_model(self, request, obj, form, change): 
     obj.author = request.user 
     obj.save() 
0

Wenn Verwendung ModelForm das Folgende einen Standardwert für ein spezielles Feld füllen. wie eingereicht Besitzer ein Charfield für Benutzernamen

def fillview(request): 
    instance = YourModel(owner=request.user.username) 
    form = YourModelForm(instance=instance) 

    if request.method == 'POST': 
     form = YourModelForm(request.POST, request.FILES) 
     if form.is_valid(): 
      pass 
      return render(request, 'success.html') 

    return render(request, 'fill.html', {'form': form}) 

Wenn angemeldet ist, könnten Sie angemeldet sehen Besitzers aktuelle Benutzername ist.

+1

Siehe auch 'initial' Argument für Django Forms. Erklärt in [diese Antwort] (http://stackoverflow.com/a/604325/310441). – Owen

+0

@Owen dies ist prägnanter, danke für das Teilen! – WeizhongTu

Verwandte Themen