2017-02-11 1 views
0

Ich baue eine Reservierung App mit Django und ich möchte Benutzern erlauben, eine Reservierung als Vorlage für eine andere zu verwenden. Meine Idee ist, dass ich ?prefill=<reservation_id> zur URL hinzufüge und dann leeres Formular mit Daten von der Reservierung in prefill Identifikationsnummer vorfulle.ValueError mit Django Formular initial

Meine CreateView sieht wie folgt aus:

class ReservationCreateView(LoginRequiredMixin, CreateUpdateMixin, CreateView): 
    model = Reservation 
    form_class = ReservationForm 
    success_url = '/' 

    def get_context_data(self, **kwargs): 
     ctx = super(ReservationCreateView, self).get_context_data() 
     r = Reservation.objects.filter(pk=self.request.GET.get('prefill')) 
     ctx['form'] = ReservationForm(initial=r.values(), request=self.request) 
     return ctx 

Das gibt mir: dictionary update sequence element #0 has length 30; 2 is required

Fehler-Stack:

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/r/create/?prefill=56cc36bd-c766-4e45-8a1b-cdde3cd87dc4 

Django Version: 1.10.3 
Python Version: 2.7.10 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.humanize', 
'tags', 
'profiles', 
'reservations', 
'drivers', 
'import_export', 
'src', 
'crispy_forms', 
'rest_framework', 
'rest_framework.authtoken', 
'corsheaders', 
'anymail', 
'wf', 
'storages', 
'djangoformsetjs'] 
Installed Middleware: 
['corsheaders.middleware.CorsMiddleware', 
'django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'htmlmin.middleware.HtmlMinifyMiddleware', 
'htmlmin.middleware.MarkRequestMiddleware'] 



Traceback: 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/contrib/auth/mixins.py" in dispatch 
    56.   return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch 
    88.   return handler(request, *args, **kwargs) 

File "/Users/jhotujec/Documents/projects/optilimo/reservations/mixins.py" in get 
    68.         route_formset=route_formset)) 

File "/Users/jhotujec/Documents/projects/optilimo/reservations/views.py" in get_context_data 
    108.   ctx['form'] = ReservationForm(initial=r.values(), request=self.request) 

File "/Users/jhotujec/Documents/projects/optilimo/reservations/forms.py" in __init__ 
    30.   super(ReservationForm, self).__init__(*args, **kwargs) 

File "/Users/jhotujec/Documents/projects/optilimo/venv/lib/python2.7/site-packages/django/forms/models.py" in __init__ 
    285.    object_data.update(initial) 

Exception Type: ValueError at /r/create/ 
Exception Value: dictionary update sequence element #0 has length 30; 2 is required 
+0

Bitte fügen Sie Ihre 'reservations/forms.py' hinzu. –

+0

Versuchen Sie, die Vererbung zu verschieben. 'Klasse ReservationCreateView (CreateView, LoginRequiredMixin, CreateUpdateMixin):' – Nether

Antwort

1

filter() gibt immer eine queryset und values() ist dann im Grunde eine Liste von dicts, während die Form eines einzelnen dict erwartet.

Sie könnten dies beheben, indem Sie stattdessen r.values()[0] verwenden, aber das ist wirklich der falsche Ansatz. Dies ist eine Modellform; Sie sollten es ausfüllen, indem Sie eine tatsächliche Modellinstanz als instance-Argument übergeben.

+0

Ich habe es versucht und es funktioniert! Aber es füllt nicht die Fremdschlüssel aus. – intelis

1

Das Problem ist initial=r.values() wo r ein QuerySet ist. values liefert eine Liste von dicts, initial erwartet eine dict. Sie könnten die Reservation Instanz und verwenden Sie den instance Parameter des Formulars Konstruktor erhalten statt:

# first() will return None if the QS is empty 
r = Reservation.objects.get(pk=self.request.GET.get('prefill')).first() 
ctx['form'] = ReservationForm(instance=r, request=self.request)