Extender el modelo de usuario de DJango

Lenguajes dinamicos, hojas de estilo, frameworks, CMS...

Moderadores: frank, dxfiles

Responder
Metal
Mensajes: 32
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: Python
Contactar:

Extender el modelo de usuario de DJango

Mensaje por Metal » Mar, 15 Mar 2011, 11:55

Tengo una tabla con todos los países y quisiera crear una relación de 1 a muchos entre países y usuarios. Es posible hacer esto??

Gracias de ante mano.
Axioma de Espinosa
Si funciona, no lo toque.

Metal
Mensajes: 32
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: Python
Contactar:

Re: Extender el modelo de usuario de DJango

Mensaje por Metal » Vie, 25 Mar 2011, 13:36

Como nadie respondió me da por pensar q es q no saben :lol: y como encontré la solución la voy a compartir con todos.

El problema es q la tabla user ya esta creada, así q se crea otra tabla (Profile) con relacion 1x1 a userd de esta manera:

Código: Seleccionar todo

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

class City(models.Model):	
	name = models.CharField(max_length=def_max_length)

	class Meta:
		app_label = "sample_user_registration"
		verbose_name = "City"
		verbose_name_plural = "Cities"	

	def __unicode__(self):
		return "%s" % self.name	

class Profile( models.Model ):
	user = models.ForeignKey(User, unique=True)	
	city = models.ForeignKey(City, null=True, blank=True, db_index=True)	

	class Meta:
		app_label = "sample_user_registration"
		verbose_name = "User profile"
		verbose_name_plural = "User profiles"	
Luego se crea un formulario por ejemplo forms.py:

Código: Seleccionar todo

from django import forms
from models import Profile, City
from registration.forms import RegistrationForm

class ProfileForm(forms.Form):  

	city = forms.ModelChoiceField(queryset=City.objects, label="City", empty_label="Not Defined")

	def save(self, user):
		try:	
			data = user.get_profile()
		except:
			data = Profile(user=user)

		data.city = self.cleaned_data["city"]
		data.save()

class UserRegistrationForm(RegistrationForm):
    city = forms.ModelChoiceField(queryset=City.objects, label="City", empty_label="Not Defined")
Luego pasa este formulario en urls.py a la vista register - la linea donde se haga esto debe estar antes de la llamada a la app registration :

Código: Seleccionar todo

from django.contrib import admin
import registration.backends.default.urls as regUrls

from profile import UserRegistrationForm
from registration.views import register
import regbackend, views

urlpatterns = patterns('', 	
	(r'^conf/admin/(.*)', admin.site.root),
	url(r'^accounts/register/$', register, {'backend': 'registration.backends.default.DefaultBackend','form_class': UserRegistrationForm}, name='registration_register'),
	(r'^accounts/', include(regUrls)),
	(r'^$', views.index),	
)
Ahora necesitamos añadir una suscripción en user_registered signal:

Código: Seleccionar todo

import profile

def user_created(sender, user, request, **kwargs):
	form = profile.UserRegistrationForm(request.POST)
	data = profile.Profile(user=user)		
	data.city_id = form.data["city"]
	data.save()

from registration.signals import user_registered
user_registered.connect(user_created)
De esta manera no solo logre crear una llave foranea en user sino q se la pongo en el formulario para q se llene cuando se cree el usuario.

Fuente: http://dmitko.ru/?p=546 En esta pagina hay un ejemplo funcional para descargar.
Axioma de Espinosa
Si funciona, no lo toque.

Responder