복붙노트

[PYTHON] 장고 등록 및 장고 프로필, 사용자 정의 양식 사용

PYTHON

장고 등록 및 장고 프로필, 사용자 정의 양식 사용

나는 장고 등록 및 장고 프로필을 사용하여 등록 및 프로필을 처리합니다. 등록시 사용자 프로필을 만들고 싶습니다. 사용자 정의 등록 양식을 작성한 후 다음 URL에있는 자습서를 사용하여 urls.py에 추가했습니다.

http://dewful.com/?p=70

이 자습서의 기본 개념은 기본 등록 양식을 재정 의하여 프로파일을 동시에 작성하는 것입니다.

forms.py - 내 프로필 앱

from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from profiles.models import UserProfile
from registration.models import RegistrationProfile

attrs_dict = { 'class': 'required' }

class UserRegistrationForm(RegistrationForm):
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))

    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_profile = UserProfile(user=new_user, city=self.cleaned_data['city'])
        new_profile.save()
        return new_user

urls.py에서

from profiles.forms import UserRegistrationForm

url(r'^register/$',
                           register,
                           {'backend': 'registration.backends.default.DefaultBackend', 'form_class' : UserRegistrationForm},
                           name='registration_register'),

양식이 표시되고 도시에 입력 할 수 있지만 DB에 항목을 저장하거나 작성하지 않습니다.

해결법

  1. ==============================

    1.중간에 있다면 - 기본 양식을 대체하는 사용자 정의 양식을 성공적으로 작성했습니다. 하지만 모델 폼에서 save () 메서드를 사용하여 사용자 지정 처리를 시도하고 있습니다. 이전 버전의 django 등록에서 가능했지만 v0.8을 사용하고 있다는 사실을 URL 주소에 백엔드로 지정했음을 알 수 있습니다.

    중간에 있다면 - 기본 양식을 대체하는 사용자 정의 양식을 성공적으로 작성했습니다. 하지만 모델 폼에서 save () 메서드를 사용하여 사용자 지정 처리를 시도하고 있습니다. 이전 버전의 django 등록에서 가능했지만 v0.8을 사용하고 있다는 사실을 URL 주소에 백엔드로 지정했음을 알 수 있습니다.

    업그레이드 가이드는 다음과 같이 말합니다 :

    즉, 버전 0.8을 사용하면 양식의 save () 메소드가 무시됩니다. 사용자 지정 백엔드 또는 신호를 사용하여 사용자 지정 처리를 수행해야합니다. 나는 커스텀 백엔드를 만들기로 결정했다. (만약 누군가이 신호로 작업한다면, 코드를 게시해라. 나는 그렇게 할 수 없다). 사용자 정의 프로필에 저장하려면이 설정을 수정할 수 있어야합니다.

    따라서 URL conf는 다음과 같습니다.

    url(r'^accounts/register/$',
        register,
        {'backend': 'accounts.regbackend.RegBackend','form_class':MM_RegistrationForm},        
        name='registration_register'
        ),
    

    regbackend.py는 필수 import를 가지고 있으며, 기본적으로 register () 메소드 만있는 DefaultBackend의 사본이며 다음을 추가합니다.

        u = User.objects.get(username=new_user.username)
        u.first_name = kwargs['first_name']
        u.last_name = kwargs['last_name']
        u.save() 
    
  2. ==============================

    2.Django Trac 티켓에 대한 내 의견에 설명 된대로 Metadata와 Django 폼에 대한 다중 상속을 허용하는 mixin을 만들었습니다. 이를 통해 필드를 하드 코딩하거나 자신을 반복하지 않고도 동시에 사용자 및 프로필 모델의 필드로 등록 할 수있는 양식을 간단하게 만들 수 있습니다. 내 메타 클래스와 mixin (및 fieldset mixin)을 사용하면 다음을 수행 할 수 있습니다.

    Django Trac 티켓에 대한 내 의견에 설명 된대로 Metadata와 Django 폼에 대한 다중 상속을 허용하는 mixin을 만들었습니다. 이를 통해 필드를 하드 코딩하거나 자신을 반복하지 않고도 동시에 사용자 및 프로필 모델의 필드로 등록 할 수있는 양식을 간단하게 만들 수 있습니다. 내 메타 클래스와 mixin (및 fieldset mixin)을 사용하면 다음을 수행 할 수 있습니다.

    class UserRegistrationForm(metaforms.FieldsetFormMixin, metaforms.ParentsIncludedModelFormMixin, UserCreationForm, UserProfileChangeForm):
        error_css_class = 'error'
        required_css_class = 'required'
        fieldset = UserCreationForm.fieldset + [(
        utils_text.capfirst(UserProfileChangeForm.Meta.model._meta.verbose_name), {
          'fields': UserProfileChangeForm.base_fields.keys(),
        })]
    
        def save(self, commit=True):
            # We disable save method as registration backend module should take care of user and user
            # profile objects creation and we do not use this form for changing data
            assert False
            return None
    
        __metaclass__ = metaforms.ParentsIncludedModelFormMetaclass
    

    여기서 UserCreationForm은 django.contrib.auth.forms.UserCreationForm 형식 일 수 있고 UserProfileChangeForm은 사용자의 프로필 모델에 대한 간단한 ModelForm입니다. (외래 키에서 False로 편집 가능을 User 모델로 설정하는 것을 잊지 마십시오.)

    그런 등록 방법을 가진 장고 등록 백엔드로 :

    def register(self, request, **kwargs):
        user = super(ProfileBackend, self).register(request, **kwargs)
        profile, created = utils.get_profile_model().objects.get_or_create(user=user)
    
        # lambda-object to the rescue
        form = lambda: None
        form.cleaned_data = kwargs
    
        # First name, last name and e-mail address are stored in user object
        forms_models.construct_instance(form, user)
        user.save()
    
        # Other fields are stored in user profile object
        forms_models.construct_instance(form, profile)
        profile.save()
    
        return user
    

    등록 신호가이 메소드의 시작 부분 (수퍼 클래스의 메소드에서)에서 보내지는 것이지 끝이 아니라는 점에주의하십시오.

    같은 방법으로 사용자 및 프로필 정보 모두에 대한 변경 양식을 만들 수 있습니다. 이것에 대한 예제는 위에서 언급 한 Django Trac 티켓에 대한 제 코멘트에서 찾을 수 있습니다.

  3. ==============================

    3.신호를 이용한 솔루션 - 여기서 신호를 사용하여 추가 데이터를 저장하는 방법을 썼습니다.

    신호를 이용한 솔루션 - 여기서 신호를 사용하여 추가 데이터를 저장하는 방법을 썼습니다.

  4. ==============================

    4.0.8 이상 등록시 :

    0.8 이상 등록시 :

    views.py 또는 이와 동등한 항목에 registration.backends.default.views.RegistrationView의 하위 클래스를 만듭니다.

    from registration.backends.default.views import RegistrationView
    
    class MyRegistrationView(RegistrationView):
    
        form_class= MyCustomRegistrationForm
    
        def register(self, request, **cleaned_data):
            new_user= super(MyRegistrationView, self).register(request, **cleaned_data)
            # here create your new UserProfile object
            return new_user
    
  5. from https://stackoverflow.com/questions/2601487/django-registration-django-profile-using-your-own-custom-form by cc-by-sa and MIT license