2009-03-12 3 views
10

create_object 뷰를 사용하여 새 객체를 만들고 request.user를 외래 키로 자동 할당 할 수 있습니까?django의 일반 create_object보기로 객체 소유자 설정

체육 시간 :

class Post(models.Model): 
    text = models.TextField() 
    author = models.ForeignKey(User) 

내가 원하는 것은 create_object를 사용하고 request.user와 저자를 채우는 것입니다.

답변

2

여러 가지면에서이 모든 솔루션은 가치가있는 것보다 문제가 될 것입니다. 이것은 해킹으로 간주됩니다. django 업데이트가 create_update가 구현되는 방식을 바꾸면 당신을 높게하고 건조하게 만드는 것이 가능합니다. 간단히하기 위해, 사용자가 로그인 한 사용자가되도록 조용히하지 않고 기본 사용자를 설정하려고한다고 가정합니다.

from django.views.generic.create_update import get_model_and_form_class 
def form_user_default(request): 
    if request.method == 'GET': 
     model, custom_form = get_model_and_form_class(Post,None) 
     custom_form.author = request.user 
     return {'form':custom_form} 
    else: return {} 

이것이 할 것입니다 것은 create_update 템플릿에 전달하는 양식 객체를 오버라이드 (override)입니다 :

상황에 맞는 프로세서를 작성합니다. 기술적으로 무엇을하는지는 기본보기가 수행 한 후 양식을 다시 만드는 것입니다. 당신의 URL의 conf에서 다음

:

url(r'pattern_to_match', 'django.views.generic.create_update.create_object', kwargs={'context_processors':form_user_default}) 

는 다시, 나는이 작업을 수행하는 방법을 알아 내기 위해 소스 코드에 탐구했다. 실제로 자신 만의 뷰를 작성하는 것이 가장 좋습니다 (그러나 가능한 한 많은 장고 사용자 정의 객체를 통합하십시오). 장고 패러다임 형태는 뷰보다는 모델 계층에보다 밀착되어 있고 뷰는 요청 객체에 대한 지식을 가지고 있기 때문에이를 수행하는 "간단한 기본"방법은 없습니다.

1

사용자가 인증되면 해당 사용자 개체는 request.user 개체입니다.

나는 create_object에 익숙하지 않다 ... 나는 아직 장고에 초보자이며, 처음으로 진짜 프로젝트를 시작했다.

사용하기 전에 사용자가 로그인했는지 확인해야합니다. 이것은 request.user.is_authenticated()으로 할 수 있습니다.

+0

나는 (감사합니다. 어쨌든;)). 내가하려는 일은 일반 뷰를 사용하여 새로운 객체를 저장하는 코드를 작성할 필요가 없다. Django 코드는 철저하게 테스트되므로 가능할 때마다 내 코드 대신 사용하는 것이 좋습니다. –

0

현재 장고 일반보기를 사용할 때 개체를 저장하는 좋은 방법은 없습니다. 일단 그들이 rewritten as classes이면 뷰 전체를 다시 작성하지 않고도 뷰를 서브 클래스 화하고 적절한 위치에 후크 할 수 있습니다.

이미 내 자신의 클래스 기반 제네릭 뷰를 사용하고 있습니다.

0
나는이 저자는 사용자 정보에 액세스 할 수 있습니다보기에 http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ 을 제시 한, create_object에 대한 래퍼를 만들기 위해 제안

. 그런 다음 extra_context를 사용하여 사용자를 템플릿에 전달해야합니다. 마지막으로 템플릿에서 사용자 정보가있는 숨겨진 필드를 추가 할 수 있습니다. 나는 그것을 시도하지 않았지만 나는 오랫동안 그것을 생각 해왔다. 희망이 솔루션은 당신에게 어울립니다! ;) 건배!

3

클로저를 고려하고 싶을 수 있습니다.

from django.forms import ModelForm 
from django.views.generic.create_update import create_object, update_object 

def make_foo_form(request): 
    class FooForm(ModelForm): 
     class Meta: 
      model = Foo 
      fields = ['foo', 'bar'] 

     def save(self, commit=True): 
      f = super(FooForm, self).save(commit=False) 
      if not f.pk: f.user = request.user 
      if commit: f.save() 
      return f 

    return FooForm 

def create_foo(request): 
    FooForm = make_foo_form(request) 
    return create_object(form_class=FooForm) 

이 각 요청에 ModelForm 개체를 만들 필요가 있기 때문에 약간의 비 효율성, 여기에,하지만 당신이 일반보기로 기능을 삽입 할 수 없습니다.

양식 작성시 추가되는 복잡성이보기 측면에서 단순성을 유지할 가치가 있는지 여부를 결정해야합니다.

여기 장점은, 그러나,이 또한 실질적으로 별도의 노력으로 업데이트 케이스와 함께 작동한다는 것입니다 : 분명히

def update_foo(request, object_id): 
    FooForm = make_foo_form(request) 
    return update_object(form_class=FooForm, object_id=object_id) 

, 당신은뿐만 아니라 더 복잡한 경우에이 방법을 사용할 수 있습니다.