2017-02-11 104 views
0

我在用Django構建一個預訂應用程序,我希望允許用戶使用一個預留作爲另一個預留。我的想法是,我將?prefill=<reservation_id>添加到網址,然後預填入prefill id中的預留數據。ValueError with Django form initial

CreateView看起來像這樣:

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 

這給了我:dictionary update sequence element #0 has length 30; 2 is required

錯誤堆棧:

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

請添加你的'reservations/forms.py'。 –

+0

嘗試移動繼承。 '類ReservationCreateView(CreateView,LoginRequiredMixin,CreateUpdateMixin):' – Nether

回答

1

filter()總是返回一個QuerySet,並values()然後基本類型的字典列表,而形式是期待一個字典。

您可以通過使用r.values()[0]來解決此問題,但這確實是錯誤的方法。這是一個模型形式;您應該通過將實際模型實例作爲參數instance來填充它。

+0

我試過這個,它的工作原理!但它不填寫外鍵。 – intelis

1

問題是initial=r.values()其中rQuerySetvalues返回dictsinitial的列表需要dict。你可以得到Reservation實例並使用instance參數的構造函數形式代替:

# 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)