0

모든 모델에 "user"필드를 추가했습니다. 사용자가 객체를 생성 할 때, 나는django 함수 일반 뷰를 클래스 기반 일반 뷰로 변환

user = models.ForeignKey(User) 

이전에 외부 키를 통해 자신의 ID를 첨부 할 나는 create_object 및 update_object을 사용했다. 필요한 사용자를 가장 쉽게 레코드에 삽입하려면 클래스 기반 제네릭 뷰로 전환해야한다고 생각합니다. 그러나 create_object 또는 update_object가 호출되기 전에 이전 함수에서 발생했던 사전 계산 중 일부를 어떻게 조작하는지 혼란 스럽습니다.

나는 모든 개체 편집을 처리 만들거나 업데이트 여부를 하나 개의 기능이 있습니다 로직 주위 정의 (나는 이러한 계산의 일부를 수행 할 때 여기서/방법/

@login_required 
def edit_item(request, modelname, submodelname=None, slug=None, id=None): 
    # Get parameter "next" to determine where to send user after object is created or updated 

    # Define which template to use 

    # Determine whether user is converting an object to another type 

    # Determine which form_class to use based on modelname and whether user is converting or not 

    # Redirect user if slug and id are not both correct 

    # Abort if user hit cancel instead of submit 

    # If object exists (slug and id are defined): 
     # Update_object with form_class, object_id, template_name, post_save_redirect, and extra_context 
    # Else 
     # Create_object with form_class, template_name, post_save_redirect, and extra_context 

클래스 기반의 일반적인보기 내를 템플릿 또는 기준에 따라 form_class)? 문서가 정의에 곧바로 들어가기 때문에 혼란 스럽습니다.

class ContactView(FormView): 
    template_name = 'contact.html' 
    form_class = ContactForm 
    success_url = '/thanks/' 

논리를 그냥 던져도 될까요?

class ContactView(FormView): 
    A = 1 + 2 
    if A == 3: 
     template_name = 'contact.html' 
    else: 
     template_name = 'contact_two.html' 
    form_class = ContactForm 
    success_url = '/thanks/' 

어떻게 것/내가 슬러그/ID가 정의되어 있는지 여부에 따라 동일한 기능에 create_object 또는 update_object을 사용하여 여기에 한 일을 대 CreateView 또는 UpdateView를 사용으로 전환하는 나의 논리를 변경해야합니까?

+2

왜 장고 기능을 변환합니까? 일반 뷰는 그리 편리하지 않습니다. 하나의 큰 마이너스는 ** 구성 대신 ** 상속 **입니다. 실제로는 클래스 기반 뷰를 직접 생성하거나 뷰 기능을 사용하는 것이 더 효과적입니다. BTW 일반보기는 최신 장고 버전에서 사용되지 않습니다. – sergzach

+0

제네릭 클래스 기반 뷰를 기반으로하지 않는 클래스 기반 뷰를 만들 것을 제안합니까? 나는 함수 기반의 create/update_object가 더 이상 사용되지 않는다는 것을 알고 있지만, 제네릭 클래스 기반 뷰로 대체되고 있다고 생각했습니다. –

+0

죄송합니다. 어쨌든 클래스 기반의 일반 뷰를 사용하기 전에 충분히 생각해보십시오. 상속 체인의 중간 위치에 새 클래스를 추가하려는 경우에는 때로는 많은 어려움이 있습니다. 한 클래스에 여러 개의 자식이 있고 한 개의 자식이 새로운 중간 클래스의 기능을 갖고 있어야하고 다른 자식이 기능을 갖고 있지 않아야하는 경우 리팩토링이 필요합니다. 공통된 부분을 여러 기능으로 처리해야합니다. 내 연습에서는 약간 융통성없는 구조가됩니다. 저기서보십시오 : http://dpaste.com/hold/823122/ – sergzach

답변

1

클래스 기반 일반 뷰에는 필요한 작업에 사용되는 메서드가 있습니다. 예를 들어 객체를 만드는 양식의 경우 CreateView을 사용하고 어떤 양식이 사용되는지 정의하려면 get_form_class() 메서드를 재정의합니다.

현재 로직을 정확하게 변환하는 대신 클래스 기반 뷰의 세부 사항을 배우는 데 시간을 할애해야합니다. 많은 공통 기능이 이미 자세히 설명되어 있습니다.