2011-02-25 3 views
5

사용자 프로필로 설정 한 "조직"이라는 모델이 있는데 등록 페이지에 "조직"모델의 필드가 나타나게하고 싶습니다. 어떻게하면 장고 등록으로이 일을 할 수 있습니까? 베이스의 URL에서장고 등록 양식에 추가 필드 추가하기

from registration.forms import RegistrationForm 
from forms import * 
from models import Organization 

class RegistrationFormWithOrganization(RegistrationForm): 
    organization_logo = field.ImageField() 
    organization_name = field.CharField() 

def save(self, profile_callback = None): 
    Organization.objects.get_or_create(user = self.cleaned_data['user'], 
             logo = self.cleaned_data['organization_logo'], 
             name = self.cleaned_data['organization_name']) 

    super(RegistrationFormWithOrganization, self).save(self, profile_callback) 

: 그리고

# models.py 
class Organization(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    logo = models.ImageField(upload_to='organizations') 
    name = models.CharField(max_length=100, null=True, unique=True) 

    # more fields below etc. 

# settings.py 
AUTH_PROFILE_MODULE = 'volunteering.organization' 

답변

2

가장 좋은 방법은 당신이 (예를 들어, "forms.py") 조직 파일이 응용 프로그램에 생성하고,이 작업을 수행하는 것 등록에 대한 기존 URL을 무시하고 사용하도록 양식으로이 양식을 추가

form organization.forms import RegistrationFormWithOrganization 

url('^/registration/register$', 'registration.views.register', 
    {'form_class': RegistrationFormWithOrganization}), 
url('^/registration/', include('registration.urls')), 

장고는 정규 표현식과 일치하는 첫 번째 URL을 사용합니다, 그래서 당신의 전화를 일치합니다 및 장고 등록하지의를 기억하십시오. 또한 등록 양식에 자신의 양식이 아닌 사용하도록 지시합니다. 여기서 많은 검증을 건너 뛰었습니다. (아마도 사용자 객체의 파생입니다 ... 그렇다면 소스 코드가 어디서 왔는지 확인하려면 등록 소스 코드를 읽으십시오). 그러나 이것은 확실히 올바른 길입니다. 당신의 노력에 최소한의 노력으로 페이지에 몇 가지.

+0

(A)'RegistrationForm'는'user' 필드가 없기 때문에이 작동하지 않을 것입니다, 그래서'self.cleaned_data [ '사용자'] 찾을 수 있습니다 'KeyError' 예외를 던질 것입니다; (b)'Organization' 객체를 생성하기 위해서는'User' 객체가 필요합니다. 새로 생성 된'user' 객체를 반환하는'RegistrationForm.save'를 호출 할 때까지 이것을 얻지 못할 것입니다. 대체 솔루션에 대한 내 대답을 참조하십시오. –

+0

@SimonKagwi 당신의 대답을 사용했지만 계속이 오류가 발생합니다 :/accounts/register/ 에서 TypeError register()는 적어도 2 개의 비 키워드 인수 (주어진 1)를 사용합니다. – anc1revv

6

이 될 것이다 가장 쉬운 방법 [테스트 django-registration 0.8] : 프로젝트의 어딘가에

이 조직 응용 프로그램에서 forms.py 말

루트에서 다음
from registration.forms import RegistrationForm 
from django.forms import ModelForm 
from models import Organization 

class OrganizationForm(forms.ModelForm): 
    class Meta: 
     model = Organization 

RegistrationForm.base_fields.update(OrganizationForm.base_fields) 

class CustomRegistrationForm(RegistrationForm): 
    def save(self, profile_callback=None): 
     user = super(CustomRegistrationForm, self).save(profile_callback=None) 
     org, c = Organization.objects.get_or_create(user=user, \ 
      logo=self.cleaned_data['logo'], \ 
      name=self.cleaned_data['name']) 

urlconf [그러나 registration.urls을 포함하고 정규식이 r'^accounts/'이라고 가정하는 정규식 패턴 위]에 다음을 추가하십시오.

from organization.forms import CustomRegistrationForm 

urlpatterns += patterns('', 
    (r'^accounts/register/$', 'registration.views.register', {'form_class':CustomRegistrationForm}), 
) 

분명히 create a custom backend 일 수도 있지만이 방법은 훨씬 쉽습니다.

+0

계속이 오류가 발생합니다 : register 2 개의 비 키워드 논증 (1 개는 주어진다). – anc1revv

+0

이것은 장고 등록의 버전이 다르기 때문입니다. 나는 그가 0.8로 재 작성했다고 생각한다. –

1

다음과 같이 코드를 수정하고 다시

urlpatterns += patterns('', 
(r'^accounts/register/$', 'registration.views.register', {'form_class':CustomRegistrationForm,'backend': 'registration.backends.default.DefaultBackend'}), 

)

+0

@ anc1rew이 하나를 시도하고 그것이 작동하는지 확인 – flexxxit

+0

그 고마워, 고마워. – Jonah

0

"이전 등록하는 동안 데이터를 수집하는 데 사용되는 양식이 새 사용자를 만들 것이라고 저장() 메소드를 구현하는 예상 시도 이는 더 이상 적용되지 않으며, 계정 생성은 백엔드에서 처리되므로 사용자 정의 로직을 사용자 정의 백엔드로 이동하거나 등록 프로세스 중에 전송 된 신호에 리스너를 연결해야합니다. "

세부 사항 :

대한 추가 정보는 here

관련 문제