Come assegnare l’utente attualmente connesso come valore predefinito per un campo del modello?

Mi piacerebbe fare qualcosa di simile a questo:

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

È ansible? Non sono riuscito a trovare il modo corretto per ottenere l’utente connesso, a parte fare request.user, in una vista, che non sembra funzionare qui.

PS_ Mi rendo conto che potrei inizializzare i dati del modello con altri mezzi, ma penso che questo sia il modo più pulito.

No, non puoi farlo in questo modo. Django (e Python) ha praticamente zero valori globali, e questa è una buona cosa ™. Normalmente si ottiene l’utente corrente nella view(request) con request.user . Puoi quindi passarlo come parametro a vari metodi / funzioni, ma provare a impostare un user globale porterà solo a lacrime in un ambiente multi-thread.

Ci dovrebbe essere un adesivo per il paraurti che dice, Globals are Evil. Questo ti darà una buona idea del mio problema numero uno con PHP.

Se si desidera ottenere questo risultato all’interno dell’interfaccia di amministrazione, è ansible utilizzare il metodo save_model. Vedi sotto un esempio:

 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() 

Se si utilizza ModelForm , quanto segue riempirà un valore predefinito per un campo speciale. ad esempio, il proprietario archiviato è un campo per il nome dell’utente

 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}) 

Una volta effettuato l’accesso, è ansible vedere il proprietario archiviato è il nome dell’utente corrente.

RISOLTO: Userò un esempio, ma la parte importante è la funzione sul views.py. L’utente è automaticamente disponibile da Django. Nota che il campo del modello ‘autor’ ha una ForeignKey per ‘Utente’. In “def form_valid” di seguito assegno all’utente attualmente connesso come valore predefinito.

Se questo è il tuo modello:

 class ProspectoAccion(models.Model): """ Model representing a comment against a blog post. """ descripcion = models.TextField(max_length=1000) autor = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) accion_date = models.DateTimeField(auto_now_add=True) prospecto= models.ForeignKey(Prospecto, on_delete=models.CASCADE) tipo_accion = models.ForeignKey('Accion', on_delete=models.SET_NULL, null=True) 

E hai una vista basata sulla class, fai quanto segue:

 class ProspectoAccionCreate(LoginRequiredMixin, CreateView): """ Form for adding una acción. Requires login (despues poner) """ model = ProspectoAccion fields = ['tipo_accion','descripcion',] def form_valid(self, form): #Add logged-in user as autor of comment THIS IS THE KEY TO THE SOLUTION form.instance.autor = self.request.user # Call super-class form validation behaviour return super(ProspectoAccionCreate, self).form_valid(form) 

QUI È UN ESEMPIO DALLA DOCUMENTAZIONE: https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user