Django 학습 기록 열흘째 - 페이지 + ModelForm

7137 단어
  • 페이지
  • 페이지 나누기에 관해서 Django 공식 문서에 있습니다. 한번 봅시다.
    여기는 저희가 아까 org-list를 가져올게요.html로 바꾸기
    우선 헤더 파일을 가져올게요.
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    

    그리고 get 요청을 작성해 봅시다.사실 여기서 우리는 홈페이지의 코드를 붙여서 수정하기만 하면 된다.우리는 이전의 get 함수를 주석해 버릴 것이다.
     def get(self, request):
            all_orgs = Organization.objects.all()
            paginator = Paginator(all_orgs, 1)  #   25           ,      3   ,            
            page = request.GET.get('page')
            try:
                contacts = paginator.page(page) 
            except PageNotAnInteger:
                # If page is not an integer, deliver first page.
                contacts = paginator.page(1)
            except EmptyPage:
                # If page is out of range (e.g. 9999), deliver last page of results.
                contacts = paginator.page(paginator.num_pages)
            #  html        all_orgs        all_orgs   ,    html           
            return render(request, 'org-list.html', {'all_orgs': contacts})
    

    여기 수정이 끝난 후에 우리는 우리의 html 안쪽만 수정하면 된다.왜냐하면 우리가 전달한 게 all 이니까.orgs, 그래서 여기서는 Paginator가 표시하는 부분을 수정하기만 하면 됩니다.
    image.png
    이것은 문서의 한 단락이므로 우리는 직접 가져와서 사용할 수 있다.

    효과를 살펴봅시다.
    image.png
    OK, 문제 없어요. 다음 페이지를 눌러 봅시다.
    image.png
    첫 페이지가 어디 갔지?여기에 우리는 아직 약간의 조작을 해야 한다.이러한 조작을 줄이기 위해서, 우리는 이 플러그인을 살펴보자.
  • django-pure-pagination

  • 사용도 간단하다. 우리는 위에서 말한 대로 한 걸음 한 걸음 OK하면 된다.또한 이 플러그인도django의pagination을 바탕으로 작성되었습니다.우리 한번 해보자.환경에 와서 django-pure-pagination을 설치해 주세요.
    pip install django-pure-pagination
    

    그리고 나서
    INSTALLED_APPS = (
        ...
        'pure_pagination',
    )
    

    그리고 우리 뷰를 다시 써주세요.
        #           
        from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
        
        def get(self, request):
            all_orgs = Organization.objects.all()
            try:
                page = request.GET.get('page', 1)
            except PageNotAnInteger:
                page = 1
            #######
            p = Paginator(all_orgs, 1, request=request)
            objects = p.page(page)
            return render(request, 'org-list.html', {
                'all_orgs': objects,
            })
    

    여기에 Paginator의 실례화에 주의해야 할 때github는 두 개의 파라미터를 주었는데 사실 여기에 3개의 중간이 필요한 1은 한 페이지에 몇 개를 표시하는 것이다.####을 붙인 곳이다.
    그리고 저희가 html을 수정해 보도록 하겠습니다.

    이곳에는 매우 중요한 곳이 하나 있는데, 우리가 for를 사용하여 우리all 를 두루 돌아다닌다.orgs 때 저희가 all 을 사용해야 돼요.orgs.object_리스트, 바로 아래. 이렇게.
    {% for org in all_orgs.object_list %}
    xxxx
    {% endfor %}
    

    안 썼으면 무슨 효과가 있었을까?
    image.png
    이런 실수가 있을 거야.여기 조심하세요!!!
  • ModelForm

  • Form의 사용을 알았으니 모델Form은 무슨 소용이 있을까요?이 용법을 설명하기 위해서, 우리는 이러한 장면을 가정한다. 만약에, 우리는 org의 일부 정보를 아래의 필드와 같이 저장해야 하는 유형이 있다면.이런 종류는 저희가 ChangOrgModel이라고 합니다.
    course_num = models.IntegerField(default=0, verbose_name=u'   ')
    students_num = models.IntegerField(default=0, verbose_name=u'    ')
    address = models.CharField(max_length=200, verbose_name=u'  ')
    

    만약 우리가 form을 사용한다면 우리는 어떻게 해야 합니까?우리는 아마 이렇게 해야 할 것이다.
    class OrgModelForm(forms.Form):
        course_num = forms.IntegerField()
        students_num = forms.IntegerField()
        address = forms.CharField(max_length=200)
    

    우리는 우리의Form정의와 모델정의는 기본적으로 별 차이가 없으니max 를 넣어야 한다는 것을 발견하기 어렵지 않다length일 때도 넣어야 한다. 우리는 다시 쓴 셈이다. 그 다음으로 여기는 세 개밖에 없다. 감각이 없다. 7, 8, 심지어 더 많을 때 이런 반복 조작은 사람을 견딜 수 없게 한다.그래서 여기서 저희가 ModelForm을 이용해서 ModelForm을 정의할 수 있어요.
    class OrgModelForm(forms.ModelForm):
        class Meta:
            model = Organization
            fields = ['course_num', 'students_num', 'address']
    

    이렇게 하면 OK입니다. 모델은 어느 모델을 연결해야 하는지, fileds는 검증하고 싶은 속성을 지정합니다.view에서 사용
    def post(self, request):
            form = OrgModelForm(request.POST)
            if form.is_valid():
                form.save(commit=True)
                return render....
    

    여기는 가상의 장면이기 때문에 이곳에서 아무것도 실현하지 못했다. 여기서 주의해야 할 점은 여기의form이다.save()에 commit=True를 꼭 써야 돼요. 저장하면 안 돼요!
    동시에 다른 사용 방법
    def post(self, request):
        org_model =  ChangOrgModel()
        form = UploadAvatarForm(request.POST, instance=org_model)
        if form.is_valid():
            form.save()
    

    여기서 저희가 모델포름을 실례화할 때 org모델 대상을 뚫고 가면 어떤 효과가 있을까요? 우리는save를 직접 사용하면 됩니다.더 많은 이해는 이곳에 와서 볼 수 있다.문서 안에 가격 비교가 중요한 곳이 하나 더 있다.여기에 clean()이라는 사용을 소개했다.
    image.png
    pubdatefield에서 추가 검증 작업을 합니다.즉, 이 필드를 정의하는 검증을 받을 수 있습니다. def clean 을 다시 쓰기만 하면 됩니다.pub_date(self): 됩니다.
  • html에서choice
  • 사용
    여기서 재미있습니다. 저희가CharField에choices를 포함한다고 정의할 때 저희 데이터베이스에 저장된 것은 사실 이전 값입니다. 그리고 흔히 뒤에 있는 값을 표시해야 합니다. 예를 들어 다음과 같습니다.
    category = models.CharField(max_length=10, choices=(('px', u'  '), ('gx', u'  '), ('gr', u'  ')), default='gx', verbose_name=u'    ')
    

    데이터베이스에
    image.png
    그러나 때때로 우리는 html에 뒤의 교육, 효율, 개인 등 정보를 표시해야 한다.이럴 때는 get 을 사용해야 해요.xxx(필드 이름)디스플레이야.우리가 먼저 주석한 OrganizationListView의 get 방법을 복원한 다음에 이곳의 학습자 수를 기구명으로 변경합니다. 단지 학습용으로만 사용할 뿐입니다. 여기는students넘이 맞지.
    image.png
    html에서 수정
    {{ org.get_category_display }}
    

    image.png
    문제 없어, 오늘은 여기까지야.
    자료 다운로드 주소 자료 직접 다운로드
    30일을 견지하고 함께 힘내자!

    좋은 웹페이지 즐겨찾기