Django ModelForm no guarda datos en la base de datos

Un principiante de Django aquí tiene muchos problemas para que los formularios funcionen. Sí, he trabajado en el tutorial y he navegado mucho por la web. Lo que tengo es una mezcla de lo que estoy encontrando aquí y en otros sitios. Estoy usando Python 2.7 y Django 1.5. (Aunque la documentación oficial es extensa, suele suponer que ya la conoces, no es una referencia para principiantes ni un tutorial avanzado)

Estoy intentando crear un formulario para detalles de usuario "extendidos", por ejemplo, nombre de la empresa, dirección, etc., pero los datos del formulario no se están guardando en la base de datos.

Inicialmente traté de crear un modelo extendiendo el estándar.User modelo, pero renuncié a eso, demasiadas modificaciones necesarias y se estaba metiendo en la cuestión de lo que estaba más allá de mí en esta etapa. Así que en lugar de eso he creado un nuevo modelo llamadoUserProfile:

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True) 
    company = models.CharField(max_length=50, blank=True)
    address1 = models.CharField(max_length=50, blank=True)
    address2 = models.CharField(max_length=50, blank=True)
    city = models.CharField(max_length=20, blank=True)
    region = models.CharField(max_length=20, blank=True)
    postcode = models.CharField(max_length=10, blank=True)
    country = models.CharField(max_length=20, blank=True)
    phone = models.CharField(max_length=30, blank = True)

He visto diferentes referencias en línea sobre si debo vincular al modelo de usuario con unForeignKey (como arriba) o con un OneToOne.

Estoy tratando de usar un ModelForm (que sea simple para lo que debería ser un formulario simple). Aquí está mi formulario.

from django.forms import ModelForm
from .models import UserProfile   

class UserDetailsForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ['company','address1','address2','city','region', 'postcode','country','phone']

Esta es mi opinión:

def UserDetailsView(request):
    #f = 0
    if request.method == 'POST':
        f = UserDetailsForm(request.POST, instance = request.user)
        if f.is_valid():
            f.save()
    else:
        f = UserDetailsForm(request.POST , instance = request.user)

    print "UserDetails objects: ", (UserProfile.objects.all()) 

    return render_to_response('plagweb/console/profile.html', 
                              { 'form': f}, 
                              context_instance=RequestContext(request))     

(sí, hay una inconsistencia en UserProfile vs UserDetail - este es un producto de todo mi piratería y se solucionará una vez que lo haga funcionar)

Demostración diagnósticaf.is_valid() volviendo verdadero. Del mismo modo, los diagnósticos muestran.UserProfile.objects.all() como estar vacio Intenté esto en la vista anterior después de guardar (), y también en la consola Django.

Aquí está mi plantilla:

 <form method="POST" action="">
 <table>{{ form }}</table>
 <input type="submit" value="Update" />
 {% csrf_token %}
 </form>

En este momento, el principal problema es que los datos del formulario no se guardan en la base de datos. No sé si se está leyendo o no (una vez que tenga algunos datos en la base de datos ...)

Un pensamiento es que elUser ¿La relación podría estar causando un problema?

Addenda, siguiendo el útil comentario / ayuda de Daniel Roseman:

Ahora el formulario se está guardando correctamente (confirmado con los diagnósticos y las comprobaciones de la línea de comandos. Sin embargo, cuando vuelvo al formulario, no se muestran los datos existentes. Se muestra un formulario con campos de datos vacíos. m pasar los datos de instancia correctamente.

¿Hay alguna configuración de ModelForm que deba cambiar?

Aquí está la vista modificada:

def UserDetailsView(request):
    #print "request co:", request.user.profile.company
    f = UserDetailsForm(request.POST, instance = request.user.profile )

    if request.method == 'POST':
        if f.is_valid():
            profile = f.save(commit=False)
            profile.user = request.user
            profile.save()

    return render_to_response('plagweb/console/profile.html', 
                              { 'form': f}, 
                              context_instance=RequestContext(request))     

Los diagnósticos muestran querequest.user.profile Se establece correctamente (específicamente el campo de la empresa). Sin embargo, el formulario se muestra con campos vacíos. La fuente HTML tampoco muestra ningún valor de datos. Como una comprobación adicional, también probé algunos diagnósticos de plantilla:

<table border='1'>
    {% for field in form%}
        <tr>
            <td>{{field.label}}</td>
            <td>{{field.value}}</td>
        </tr>
    {% endfor%}
</table>

Esto lista las etiquetas de campo correctamente, pero todos los valores se informan comoNone.

Para completar, el campo de usuario UserProfile ahora se define comouser = models.OneToOneField(settings.AUTH_USER_MODEL) y la expresión lambda User.profile no se modifica.

Respuestas a la pregunta(2)

Su respuesta a la pregunta