1

사용자 등록이 어려워 실제로 다른 프로필 유형을 사용하려고합니다. 등록하는 동안 사용자를 생성하는 동안 UserProfile을 설정할 수 없습니다. UserCreationForm을 사용하고 있습니다. 내 파일의 코드는 다음과 같습니다.django 프로필 만들기, 여러 프로필 유형을 사용하는 동안 사용자 프로필 설정

from django.contrib.auth.forms import UserCreationForm 
from registration.forms import RegistrationForm 
from django import forms 
from django.contrib.auth.models import User 
from accounts.models import UserProfile 
from django.utils.translation import ugettext_lazy as _ 
from person.models import Person 
from pprint import pprint 


class UserRegistrationForm(UserCreationForm): 
    #email = forms.EmailField(label = "Email") 
    fullname = forms.CharField(label = "Full name") 

    class Meta: 
     model = User 
     fields = ("email","fullname","password1","password2") 

    def __init__(self, *args, **kwargs): 
     super(UserRegistrationForm, self).__init__(*args, **kwargs) 
     del self.fields['username'] 

    def clean_email(self): 
     """ 
     Validate that the supplied email address is unique for the 
     site. 

     """ 
     if User.objects.filter(email__iexact=self.cleaned_data['email']): 
      raise forms.ValidationError(_("This email address is already in use. Please supply a different email address.")) 
     return self.cleaned_data['email'] 

    def save(self, commit=True): 
     user = super(UserRegistrationForm, self).save(commit=False) 
     #user_profile=user.set_profile(profile_type="Person") 

     UserProfile.profile.person.full_name = self.cleaned_data["fullname"] 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

class CompanyRegistrationForm(UserCreationForm): 
    email=forms.EmailField(label="Email") 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model=UserProfile 
     exclude=('user',) 

계정/models.py는

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


class UserProfile(models.Model): 
    user=models.OneToOneField(User) 
    meta_keywords=models.CharField("Meta Keywords",max_length=255, 
      help_text="Comma delimited set of keywords of meta tag") 
    meta_description=models.CharField("Meta Description",max_length=255, 
      help_text='Content for description meta tag') 

    def __unicode__(self): 
     return "User Profile for: "+self.username 

    class Meta: 
     ordering=['-id'] 

views.py

from django.contrib.auth.forms import UserCreationForm 
from django.template import RequestContext 
from django.shortcuts import render_to_response,get_object_or_404 
from django.core import urlresolvers 
from django.http import HttpResponseRedirect 
from django.contrib.auth.decorators import login_required 
from accounts.forms import UserRegistrationForm, UserProfileForm 
#from accounts.forms import UserProfile 

def register(request,template_name="account/register.html"): 
    if request.method=='POST': 
     postdata=request.POST.copy() 
     form=UserRegistrationForm(postdata) 
     user_profile=UserProfileForm(postdata) 
     if form.is_valid(): 
      form.save() 
      un=postdata.get('username','') 
      pw=postdata.get('password','') 
      from django.contrib.auth import login,authenticate 
      new_user=authenticate(username=un,password=pw) 
      if new_user and new_user.is_active: 
       login(request,new_user) 
       url=urlresolvers.reverse('dashboard') 
       return HttpResponseRedirect(url)  
    else: 
     form=UserRegistrationForm() 
    page_title="User Registration" 
    return render_to_response(template_name,locals(),context_instance=RequestContext(request)) 


@login_required 
def dashboard(request): 
    pass 

@login_required 
def settings(request): 
    pass 

내가 여러 프로필을 사용하고 그래서 다음 그 프로파일 'models.py 중 하나의 코드입니다

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

class Person(UserProfile): 
    skills=models.CharField(max_length=100) 
    fullname=models.CharField(max_length=50) 
    short_description=models.CharField(max_length=255) 
    is_online=models.BooleanField(default=False) 
    tags=models.CharField(max_length=50) 
    profile_pic=models.ImageField(upload_to="person_profile_images/") 
    profile_url=models.URLField() 
    date_of_birth=models.DateField() 
    is_student=models.BooleanField(default=False) 
    current_designation=models.CharField(max_length=50) 
    is_active_jobseeker=models.BooleanField(default=True) 
    current_education=models.BooleanField(default=True) 


    class Meta: 
     db_table='person' 

내 프로필 인증 accounts.models에서 이 accounts.forms에서 USERPROFILE 가져 person.models 가져 오기에서 UserProfileForm 수입 : N settings.py 여기

AUTH_PROFILE_MODULE='accounts.UserProfile' 

또한 내가, profile.py 다른 곳을보고 한 후 사용하는 파일입니다 company.models에서 사람 는 회사

def retrieve(request,profile_type): 
    try: 
     profile=request.user.get_profile() 
    except UserProfile.DoesNotExist: 
     if profile_type=='Person': 
      profile=Person.objects.create(user=request.user) 
     else: 
      profile=Company.objects.create(user=request.user) 
     profile.save() 
    return profile 

def set(request,profile_type): 
    profile=retrieve(request,profile_type) 
    profile_form=UserProfileForm(request.POST,instance=profile) 
    profile_form.save() 

나는 새로운 오전과 혼란은, 또한 문서를 보았다 가져옵니다. 또한 stackoverflow.com 다른 솔루션을 보았지만 내 문제의 해결책을 찾지 못했습니다. 그러니 나에게 도움이되는 것을 찾았 으면 알려주세요. 그것은 큰 문제로 보이지 않습니다. 그러나 저는 그것에 익숙하지 않으므로 저에게는 문제입니다.

답변

2

장고 프로파일 메커니즘에서 요구하는 OneToOne 관계에서는 여러 프로필 유형이 작동하지 않습니다. 모든 프로파일 유형에 공통된 데이터를 포함하는 단일 프로파일 클래스를 유지하고 유형별 데이터를 generic relation을 사용하여 프로파일 클래스에 링크하는 별도의 클래스 세트에 저장하는 것이 좋습니다.

편집 : 명확한 설명을 위해

감사합니다. 오늘 코드를 다시 살펴보면 모델 상속을 사용하여 수행하려는 작업을 실제로 수행 할 수있는 것으로 보입니다. 나는 문제가 UserRegistrationFormsave() 방법에 있다고 생각한다. 다음과 같이 시도하십시오.

def save(self, commit=True): 
    user = super(UserRegistrationForm, self).save(commit=False) 
    user.email = self.cleaned_data["email"] 
    if commit: 
     user.save() 
     person = Person(user=user) 
     person.full_name = self.cleaned_data["fullname"] 
     person.save() 
    return user 
+0

고유 한 값이 True 인 사용자 Foreignkey를 사용하면 어떻게됩니까? 그러면 어떻게 연결합니까? 모델 현명한 때문에, 나는 이미 R & D를 해왔다. 그래서 나는 현재 프로파일을 연결하는 데 문제가있다. 사용자 등록은 이전에하지 않았으므로. 그래서 부모 클래스가 USerProfile이고 다른 Person과 Company가 2 가지를 상속하는지 여부를 연결하는 방법을 모르겠습니다. – Hafiz

+0

그럼'Person (user = user)'를 쓰면 Person에 연결하고'UserProfile'과'Person' 테이블에있는 데이터를 업데이트 할 것인가? 그래서 장고는이 성명서로 그 모든 연결을 이해할 것인가? 어리석은 질문을 위해 유감스럽게 여기는 그러나 나는 그것에서 새롭다 다만 이해하고 싶, 그것을 다시 보는 당신의 시간 동안 진짜로 감사한다 – Hafiz

+0

나는 그것이 작동해야한다 것을 나는 생각한다. 그래도 테스트하지 않았습니다. 너 해봤 어? 특별히 문제가 있습니까? –