2012-07-26 20 views
5

Vi otra respuesta here y otros lugares en la web que recomiendan usar user.get_profile al extender el usuario django incorporado. No hice eso en el siguiente ejemplo. La funcionalidad parece funcionar bien, pero ¿hay algún inconveniente para no usar user.get_profile()?¿Cuándo debería usar user.get_profile en django?

modelo

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    quote = models.CharField('Favorite quote', max_length = 200, null=True, blank=True) 
    website = models.URLField('Personal website/blog', null=True, blank=True) 

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('quote', 'website') 

vista

@login_required 
def user_profile(request): 
    user = User.objects.get(pk=request.user.id) 
    if request.method == 'POST': 
     upform = UserProfileForm(request.POST) 
     if upform.is_valid(): 
      up = upform.save(commit=False) 
      up.user = request.user 
      up.save() 
      return HttpResponseRedirect('/accounts/profile') 
    else: 
     upform = UserProfileForm() 
    return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request)) 
+0

Puede soltar la línea 'user = User.objects.get (pk = request.user.id)' de su Vista. 'request.user' ya es la instancia del Modelo de Usuario. Además, 'locals()' tiene un nombre sospechoso; no está definido en la Vista, ¿es realmente local? – JCotton

+2

@JCotton Usar ['locals()'] (http://docs.python.org/library/functions.html#locals) es una función incorporada. Aquí se usa como un hack para evitar tener que definir manualmente el diccionario de contexto de la plantilla. Es un ahorro de tiempo, pero probablemente sea una mejor práctica definir explícitamente el contexto. Buen punto sobre 'request.user'. – Alasdair

+0

@Alasdair ¡gracias! no sabía eso sobre 'locals()' – JCotton

Respuesta

3

El código funciona como se ha escrito, sino porque usted no pasa una instancia para su modelo que es un poco inusual, por lo que podría toma otro desarrollador de Django un poco más para resolver lo que está pasando.

La vista que enlaza crea una instancia del modelo con una instancia, de modo que los valores de perfil existentes se muestren en el formulario. En tu caso, obtendrás campos vacíos.

upform = UserProfileForm(instance=user.get_profile()) 

Debido a que no proporciona una instancia, el ahorro sería tratar de crear un nuevo user_profile, lo que no queremos. Eso no sucederá en su caso, porque ha hecho que user sea la clave principal, pero eso también es un poco inusual.

La principal ventaja de escribir user.get_profile() es que no necesita saber qué modelo se utiliza para el perfil de usuario. Si está contento con codificar el modelo UserProfile en su código, puede poner instance=UserProfile.objects.get(user=user) en su lugar.

+0

¿Quiere decir reemplazar la línea "usuario = Usuario.objetos.get (pk = request.user.id)" con lo que ha escrito arriba además de reemplazar "upform = UserProfileForm (request.POST) "with" upform = UserProfileForm (instance = user.get_profile()) "? – sharataka

+0

Deje la línea de usuario tal como está o reemplácela con 'user = request.user' tal como lo sugiere JCotton en el comentario anterior. Al crear el formulario, 'instancia' es un argumento adicional, no reemplaza' data = request.POST'. Establezca 'instance' * both * veces que crea el formulario. – Alasdair

Cuestiones relacionadas