2009-03-12 8 views

Odpowiedz

2

Pod wieloma względami wszystkie rozwiązania tego problemu będą większym problemem niż są warte. Ten kwalifikuje się jako hack. Jest możliwe, że aktualizacja django pozostawi cię wysoko i na sucho, jeśli zmienią sposób implementacji create_update. Dla uproszczenia założę, że próbujesz ustawić domyślnego użytkownika, a nie po cichu zmusić użytkownika do zalogowania się.

Napisz procesor kontekstowego:

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 {} 

Co to będzie zrobić, to zastąpić obiekt formularza, który create_update przechodzi do szablonu. Technicznie rzecz biorąc, jest to ponowne utworzenie formularza po wykonaniu domyślnego widoku.

Następnie w adresie URL conf:

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

Znowu musiałem zagłębić się w kodzie źródłowym, aby dowiedzieć się, jak to zrobić. Najlepiej byłoby spróbować napisać własny widok (ale uwzględnić jak najwięcej niestandardowych obiektów Django). Nie ma "prostego domyślnego" sposobu, aby to zrobić, ponieważ w paradygmacie django formy są ściślej związane z warstwą modelu niż z widokami, a tylko widoki mają wiedzę o obiekcie żądania.

1

Jeśli użytkownik jest uwierzytelniony, jego obiektem użytkownika jest obiekt request.user.

Nie jestem zaznajomiony z create_object ... Wciąż jestem początkującym użytkownikiem django i dopiero zacząłem z nim swój pierwszy prawdziwy projekt.

Należy pamiętać, że przed użyciem należy sprawdzić, czy użytkownik jest zalogowany. Można to zrobić za pomocą request.user.is_authenticated().

+0

Wiem (dzięki w każdym razie;)). Próbuję użyć ogólnego widoku dla tego, więc nie muszę pisać kodu do zapisania nowego obiektu. Kod Django jest dokładnie testowany, więc kiedy tylko jest to możliwe, wolę używać go zamiast własnego kodu. –

0

Nie ma dobrego sposobu na przechwycenie zapisu obiektu podczas korzystania z bieżących widoków Django. Po uzyskaniu rewritten as classes, będziesz mógł podklasować widok i podłączyć się we właściwym miejscu bez konieczności przepisywania całego widoku.

Korzystam już z własnych ogólnych widoków opartych na klasach z tego powodu.

0

Proponuję zrobić otoki dla create_object, jak to autor sugeruje http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ w widoku będziesz miał dostęp do informacji użytkownika. Następnie należy użyć extra_context, aby przekazać użytkownika do szablonu. Na końcu w szablonie możesz dodać ukryte pole z informacjami o użytkowniku. Nie próbowałem tego, ale myślałem o tym od dłuższego czasu. Mam nadzieję, że to rozwiązanie Ci odpowiada! ;) Pozdrawiam!

3

Możesz rozważyć zamknięcie.

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) 

Istnieje pewna nieefektywność tutaj, ponieważ trzeba utworzyć obiekt ModelForm na każde żądanie, ale to nie pozwalają, aby wprowadzić funkcje w widoku generycznego.

Musisz zdecydować, czy dodana złożoność tworzenia formularza jest warta zachowania prostoty po stronie widoku.

Korzyścią tutaj jest jednak to, że ta działa również z przypadku aktualizacji praktycznie bez dodatkowego wysiłku:

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

Oczywiście, można użyć tego podejścia do bardziej skomplikowanych przypadkach.

Powiązane problemy