django - cleaned_data - CreateView를 ModelForm과 어떻게 사용합니까?



django template form field (1)

내 양식을 제출할 때 내 클래스 AuthorCreateForm에서 오류가 발생합니다. NameError 자체가 정의되지 않았습니다.

CreateForm은 어떻게 사용합니까?

내 Author.py 파일에 클래스를 만들었습니다.

from django.views.generic import TemplateView, ListView, CreateView
from books.models import Author, Publisher, Book
from books.forms import AuthorForm

class AuthorCreateView(CreateView):
    objAuthorForm = AuthorForm(self.request.POST)

    if(objAuthorForm.save()):
        success = "Form saved!"
    else:
        error = "There was an error!"

그리고 / Author / Create에 제출하는 html 템플릿이 있습니다.

나는 내 urls.py에 다음 줄을 가지고있다.

('^authors/create/$', Author.AuthorCreateView.as_view()),

이 URL에 양식을 렌더링합니다.

('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),

클래스 기반 뷰가 혼란 스럽다는 것을 알았습니다. 누군가 CRUD 작업에 사용하는 방법에 대한 좋은 자습서를 가지고 있습니까?

감사


Answer #1

당신이 가지고있는 것은 python 오류입니다 - self 는 정의되지 않았습니다. self 는 일반적으로 클래스 메서드에서 클래스 인스턴스 자체를 참조하는 것입니다.

어쨌든, 나는 동의한다, 그것 상표가 붙은 새롭고 문서화되지 않은. 나는 소스를 보는 것이이 시점에서 절대적으로 중요하다고 생각한다.

클래스 기반 뷰에 익숙해지기 위해 나는 몇 가지 메소드 만 구현하는 django.views.generic.base.View 를 서브 클래 싱하는 django.views.generic.base.View 시작한다. 즉, 요청 메소드 (post, get, get 등)에 따라 클래스에서 함수를 호출하려고 시도한다. 머리, - 근원을보십시오).

예를 들어, 뷰 기능을 새로운 뷰 클래스로 대체하는 첫 번째 단계는 다음과 같습니다.

class MyClassBasedView(View):
    def get(self, request):
        # behave exactly like old style views
        # except this is called only on get request
        return http.HttpResponse("Get")

    def post(self, request):
        return http.HttpResponse("Post")

(r'^foobar/$', MyClassBasedView.as_view())

특정 질문으로 돌아 가기 :

모든 TemplateView.as_view() 는 템플릿을 렌더링합니다. - CreateViewModelForms 와 템플릿 렌더링 ( TemplateView )을 처리하는 다른 여러 클래스의 조합입니다.

아주 기본적인 예를 들어, 어떤 클래스 mixinsmixins 에 의해 사용되는지 문서 를보십시오.

TemplateResponseMixin , ModelFormMixinProcessFormView 구현되어 있으며 각 클래스에 대한 메소드 목록이 들어 있습니다.

가장 기본적인 CreateView

가장 기본적인 수준에서 CreateViewModelFormMixin여기에 설명 된 모델 또는 사용자 정의 ModelForm 클래스 를 제공하십시오.

CreateView 클래스는 다음과 같습니다.

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'

이러한 3 가지 핵심 속성이 설정되면 URL에서 호출하십시오.

('^authors/create/$', Author.AuthorCreateView.as_view()),

페이지를 렌더링하면 ModelForm이 form 템플릿에 전달 된 것을 볼 수 있으며 form.save() 를 호출하고 success_url 리디렉션 할뿐만 아니라 양식 유효성 검사 단계 ( request.POST / 유효하지 않은 경우 다시 전달 form.save() 를 처리합니다. .

클래스 메소드 오버라이드 시작

비헤이비어를 사용자 정의하려면 mixins 대해 설명 된 메소드를 무시하십시오.

일반 뷰 함수처럼 HttpResponse 를 반환해야한다는 것을 기억하십시오.

ModelFormMixin 문서화 된 form_invalid 덮어 form_invalid 예제 :

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'

    def form_invalid(self, form):
        return http.HttpResponse("form is invalid.. this is just an HttpResponse object")

이 메소드 별 오버라이드는 양식이보다 고급화되면서 매우 유용 해지기 시작하며 궁극적으로 필요한 부분 만 재정 의하여 소수의 코드 줄로 거대한 양식을 작성할 수 있습니다.

request 개체와 같은 양식 사용자 지정 매개 변수를 전달하려는 경우 (양식에서 사용자에게 액세스해야하는 경우 매우 일반적) : get_form_kwargs 를 재정의하기 get_form_kwargs 됩니다.

class MyFormView(FormView):
    def get_form_kwargs(self):
        # pass "user" keyword argument with the current user to your form
        kwargs = super(MyFormView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

클래스 기반 뷰는 스마트 클래스 사용의 빛나는 예제입니다. 그것은 저에게 뷰와 파이썬 수업을위한 제 자신의 믹스 인을 만들기위한 훌륭한 소개를주었습니다. 그것은 무수한 시간을 절약하고 있습니다.

와우, 이렇게 오래 됐어. 생각하기 그것은 문서 코멘트에 단순한 URL로 시작 :) 희망은 도움이!