실전 Django: Rango Part4


이 부분에서 우리는 사용자 시스템을 어떻게 설계하는지 배우기 시작할 것이다. Django는'django.contrib.auth'라는 응용을 제공했다. 우리는 이를 이용하여 사용자 등록, 로그인, 로그아웃 등 일련의 기능을 할 수 있다.
17. 사용자 모델
Django 자체 사용자 시스템의 사용자 모델에는 다음과 같은 데이터가 포함되어 있습니다.
  • 사용자 이름
  • 비밀번호
  • 이메일
  • 이름
  • 사용자 모델에 다음과 같은 추가 필드를 추가하려고 합니다.
  • 링크 필드: 사용자가 자신의 개인 사이트를 보여줄 수 있음
  • 이미지 필드: 사용자가 자신의 이미지를 설정할 수 있도록
  • 우리는 모델을 업데이트하기만 하면 상술한 수요를 실현할 수 있다.rango/models를 편집한다.py 파일, 먼저 머리에 줄을 추가합니다.
    rango/models.py:
    from django.contrib.auth.models import User

    그런 다음 파일 끝에 다음과 같은 항목을 추가합니다.
    rango/models.py:
    class UserProfile(models.Model):
        #        ,  UserProfile Django     
        user = models.OneToOneField(User)
    
        #            
        website = models.URLField(blank=True)
        picture = models.ImageField(upload_to='profile_images', blank=True)
    
        #   __str__  ,            
        def __str__(self):
            return self.user.username

    이 두 필드에 'Blank=True' 를 설정했습니다. 글자의 뜻대로 이 필드가 비어 있는 것을 허용하는 리듬입니다.
    "ImageField"필드에 "upload to"속성이 있습니다. 사용자 이미지를 저장하는 폴더를 지정합니다. 이 "profile images"라는 폴더는 settings에 저장됩니다.py에 지정된 MEDIAROOT 폴더의 경로는 다음과 같습니다.
    rangoproject/media/profile_images/

    모델이 완성된 후에 우리는 데이터베이스를 업데이트한 다음dos 명령 알림부호 아래에서 다음과 같은 명령을 실행해야 한다.
    $ python manage.py makemigrations rango

    dos 명령 프롬프트에서 명령을 계속 실행합니다.
    $ python manage.py migrate

     
    18. PIL 설치
    Django의 ImageField는 Python의 이미지 라이브러리 PIL을 사용합니다. PIL을 설치하지 않았다면 먼저 설치해야 합니다.
    Windows 플랫폼의 Python 3.2 환경에서는 이 버전을 설치하는 것이 좋습니다.
    https://pypi.python.org/pypi/Pillow/2.6.0
    그중의 Pillow - 2.6.0을 찾으세요.win32-py3.2.exe(md5), 다운로드한 후 바로 설치하면 됩니다.Python 32비트 버전입니다.
     
    19. 관리 인터페이스에 UserProfile 등록
    rango/admin 편집py 파일을 다음과 같이 만듭니다.
    rango/admin.py:
    from django.contrib import admin
    from rango.models import Category, Page
    from rango.models import UserProfile
    
    class PageAdmin(admin.ModelAdmin):
        list_display = ('title', 'category', 'url')
    
    class CategoryAdmin(admin.ModelAdmin):
        prepopulated_fields = {'slug':('name',)}
    
    admin.site.register(Category, CategoryAdmin)
    admin.site.register(Page, PageAdmin)
    admin.site.register(UserProfile)

     
    20. 사용자 등록 보기 및 템플릿 만들기
    '사용자 등록'기능은 사용자가 우리 사이트에서 계정을 만들 수 있도록 할 것이다. 우리는 이 기능에 보기와 상응하는 템플릿을 추가해야 한다.다음은 완료할 작업입니다.
  • UserForm과 UserProfileForm 두 개의 폼을 만듭니다.
  • 보기를 추가하여 새 사용자를 처리한다.
  • UserForm과 UserProfileForm 두 개의 폼을 표시하는 템플릿을 만듭니다.
  • URL을 위에서 만든 뷰에 매핑합니다.
  • 첫 페이지에 등록 페이지의 링크를 추가한다.

  • 한 걸음 한 걸음 이 내용들을 실현합시다!rango/forms 편집py 파일을 다음과 같이 만듭니다.
    rango/forms.py:
    class UserForm(forms.ModelForm):
        password = forms.CharField(widget=forms.PasswordInput())
    
        class Meta:
            model = User
            fields = ('username', 'email', 'password')
    
    class UserProfileForm(forms.ModelForm):
        class Meta:
            model = UserProfile
            fields = ('website', 'picture')

     
    UserForm과 User ProfileForm 두 개의 폼에 두 개의 메타 클래스를 추가했습니다. 각각의 메타 클래스는 모델 필드를 가지고 있습니다. 이 폼이 데이터베이스에 연결될 테이블을 알려 줍니다. 예를 들어 UserForm이 연결될 테이블이 User 테이블입니다.
    마지막으로forms를 잊지 마세요.py 머리를 다음과 같이 변경합니다:
    rango/forms.py:
    from django import forms
    from django.contrib.auth.models import User
    from rango.models import Category, Page, UserProfile

    위의 이것들을 다 하고 우리는 사용자 등록 보기를 만들 것이다.
    rango/views 편집py, 다음을 추가합니다.
    rango/views.py:
    from rango.forms import UserForm, UserProfileForm
    
    def register(request):
    
        # registered:         .
        #     False,             True
        registered = False
    
        #      HTTP POST  ,             .
        if request.method == 'POST':
            #
            #   UserForm UserProfileForm        .
            user_form = UserForm(data=request.POST)
            profile_form = UserProfileForm(data=request.POST)
    
            #       ...
            if user_form.is_valid() and profile_form.is_valid():
                #              .
                user = user_form.save()
    
                #  set_password      .
                #         .
                user.set_password(user.password)
                user.save()
    
                #      UserProfile  .
                #    commit False.
                #               ,          。
                profile.user = user
    
                #         (  )?
                #    ,          .
                if 'picture' in request.FILES:
                    profile.picture = request.FILES['picture']
    
                #  UserProfile  .
                profile.save()
    
                #   registered  ,    True,                 .
                registered = True
    
            #        
            #              .
            else:
                print(user_form.errors, profile_form.errors)
    
        #  HTTP POST  ,                 ,      .
        else:
            user_form = UserForm()
            profile_form = UserProfileForm()
    
        #         .
        return render(request,
                'rango/register.html',
                {'user_form': user_form, 'profile_form': profile_form, 'registered': registered} )

    다음에 등록 템플릿을 만들고templates/rango/register를 만듭니다.html
    templates/rango/register.html:
    DOCTYPE html>
    <html>
        <head>
            <title>Rangotitle>
        head>
    
        <body>
            <h1>  Rangoh1>
    
            {% if registered %}
            Rango : <strong>        !strong>
            <a href="/rango/">     .a><br />
            {% else %}
            Rango : <strong>      !strong><br />
    
            <form id="user_form" method="post" action="/rango/register/"
                    enctype="multipart/form-data">
    
                {% csrf_token %}
    
                
                ` user_form`.`as_p `
                ` profile_form`.`as_p `
    
                
                <input type="submit" name="submit" value="  " />
            form>
            {% endif %}
        body>
    html>

    보기와 템플릿이 모두 끝났습니다. URL 매핑을 처리하고 그것들을 연결해야 합니다.rango/urls 편집py, 다음과 같이 변경:
    rango/urls.py:
    urlpatterns = patterns('',
        url(r'^$', views.index, name='index'),
        url(r'^about/$', views.about, name='about'),
        url(r'^category/(?P\w+)$', views.category, name='category'),
        url(r'^add_category/$', views.add_category, name='add_category'),
        url(r'^category/(?P\w+)/add_page/$', views.add_page, name='add_page'),
        url(r'^register/$', views.register, name='register'), #        !
        )

    마지막으로 우리는 첫 페이지 템플릿(templates/rango/index.html)을 수정하고'등록'링크를 첫 페이지에 두어야 한다.다음을 수행하십시오.

    좋은 웹페이지 즐겨찾기