models.py của tôi:hồ sơ người dùng khác nhau với django-profiles & django đăng ký
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)
tôi sử dụng để lập bản đồ BaseProfile user_id để user_type cụ thể. Tôi muốn sử dụng ProxyProfile như proxy mà tải user_type tùy cấu hình để ModelForm như hình dưới đây
Nội dung forms.py tôi:
class ProfileForm(ModelForm):
...
class Meta:
model = ProxyProfile
exclude = ('user','user_type')
...
ProfileForm được cung cấp để django-profile sử dụng đoạn mã sau trong urls.py:
urlpatterns += patterns('',
url(r'^profiles/edit/', edit_profile,
{'form_class': ProfileForm},
name='profiles_edit_profile'),
(r'^profiles/',include('profiles.urls')),
)
tôi cũng đặt trong settings.py:
AUTH_PROFILE_MODULE = 'main.ProxyProfile'
Trong quá trình đăng ký người dùng, tất cả dữ liệu db được điền chính xác (có vẻ như mọi thứ đều OK). tôi ghi danh bằng hình thức truyền cho django-đăng ký:
urlpatterns += patterns('',
url(r'^register/$', register,
{'form_class': UserRegistrationForm},
name='registration.views.register'),
(r'', include('registration.urls')),
)
từ 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
Và đăng ký giai đoạn hoạt động OK.
Tôi gặp sự cố với trang chỉnh sửa/chi tiết tiểu sử. Hồ sơ của tôi được lọc trong mô hình ProxyProfile và được sử dụng làm FormModel trong ProfileForm không được hiển thị (Tôi không thể xem các trường cụ thể của hồ sơ không được hiển thị trên trang HTML) Có thể có một số cách khác (giống như cách Django :)) này (chọn và hiển thị mô hình hồ sơ tùy thuộc vào trường user_type có liên quan đến mô hình Người dùng).
Cảm ơn trước :)
Tôi thấy bạn đã sử dụng một mô hình proxy. Bất kỳ lý do nào bạn không thể chỉ làm cho BaseProfile là một lớp cơ sở trừu tượng (xem http://docs.djangoproject.com/en/1.2/topics/db/models/#abstract-base-classes) để Django sẽ tải đúng subtype cho bạn? –
Tôi đã sử dụng mô hình proxy dựa trên BaseProfile vì tôi muốn ghi đè phương thức get_profile từ lớp Người dùng. get_profile() được gọi bởi ứng dụng django-profiles để tìm nạp mô hình hồ sơ liên kết với người dùng. Vấn đề là tôi đã có các mô hình hồ sơ khác nhau cho những người dùng khác nhau (nhưng một người dùng <-> một loại tiểu sử). –