Moja models.py:różne profile użytkowników z Django profile i django rejestracji
USER_TYPES = (
('D', 'Demo' ),
('F', 'Free' ),
('P', 'Premium'),
)
class BaseProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
user_type = models.CharField(max_length=1, blank=True, choices=USER_TYPES)
class DemoProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
demo = models.CharField(max_length=10, blank=True)
...
class FreeProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
free = models.CharField(max_length=10, blank=True)
...
class PremiumProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
premium = models.CharField(max_length=10, blank=True)
...
class ProxyProfile(BaseProfile):
class Meta:
proxy = True
def get_profile(self):
if self.user_type == 'D':
return DemoProfile._default_manager.get(user__id__exact=self.user_id)
elif self.user_type == 'F':
return FreeProfile._default_manager.get(user__id__exact=self.user_id)
else:
return PremiumProfile._default_manager.get(user__id__exact=self.user_id)
używam BaseProfile mapować user_id do konkretnego user_type. Chciałem użyć ProxyProfile jako serwer proxy, który ładuje user_type zależności profile do ModelForm jak pokazano poniżej
Treści mojego forms.py:
class ProfileForm(ModelForm):
...
class Meta:
model = ProxyProfile
exclude = ('user','user_type')
...
ProfileForm jest przewidziany do Django profili za pomocą następującego kodu w urls.py:
urlpatterns += patterns('',
url(r'^profiles/edit/', edit_profile,
{'form_class': ProfileForm},
name='profiles_edit_profile'),
(r'^profiles/',include('profiles.urls')),
)
mam ustawione również w settings.py:
AUTH_PROFILE_MODULE = 'main.ProxyProfile'
Podczas rejestracji użytkownika wszystkie dane bazy danych są wypełnione poprawnie (wygląda na to, że wszystko jest w porządku). zarejestrować za pomocą formularza przekazanego do Django rejestracji:
urlpatterns += patterns('',
url(r'^register/$', register,
{'form_class': UserRegistrationForm},
name='registration.views.register'),
(r'', include('registration.urls')),
)
z forms.py:
class UserRegistrationForm(RegistrationFormUniqueEmail, RegistrationFormTermsOfService):
utype = forms.ChoiceField(choices=USER_CHOICES)
def save(self, profile_callback=None):
new_user = RegistrationProfile.objects.create_inactive_user(username=self.cleaned_data['username'],
password.self.cleaned_data['password1'],
email=self.cleaned_data['email'],
)
new_base_profile = BaseProfile(user=new_user, user_type=self.cleaned_data['utype'])
if self.cleaned_data['utype'] == "D":
new_profile = DemoProfile(user=new_user)
if self.cleaned_data['utype'] == "F":
new_profile = FreeProfile(user=new_user)
if self.cleaned_data['utype'] == "P":
new_profile = PremiumProfile(user=new_user)
new_profile.save()
new_base_profile.save()
return new_user
i rejestracji faza działa OK.
Mam problem z edycją profilu/stronami szczegółów. Moje profile filtrowane w ProxyProfile i używane jako FormModel w ProfileForm nie są renderowane (nie widzę pól specyficznych dla profilu nie są renderowane do strony HTML) Może jest jakiś inny sposób (bardziej jak sposób Django :)) do zrobienia to (wybierz i wyrenderuj model profilu w zależności od pola user_type, które jest powiązane z modelem User).
góry dzięki :)
Widzę, że używany model proxy. Każdy powód, dla którego nie można po prostu uczynić BaseProfile abstrakcyjną klasą podstawową (zobacz http://docs.djangoproject.com/en/1.2/topics/db/models/#abstract-base-classes), aby Django ładował poprawnie podtyp dla ciebie? –
Użyłem modelu proxy opartego na BaseProfile, ponieważ chciałbym nadpisać metodę get_profile z klasy User. Funkcja get_profile() jest wywoływana przez aplikację django-profiles w celu pobrania modelu profilu powiązanego z użytkownikiem. Problem polega na tym, że mam różne modele profili dla różnych użytkowników (ale jeden użytkownik ma jeden typ profilu). –