2017-02-11 15 views
0

Djangoの予約アプリを作成しています。ユーザーが1つの予約を別の予約のテンプレートとして使用することを許可します。私の考えは、?prefill=<reservation_id>をurlに追加し、空のフォームにprefill idの予約データをあらかじめ入力しておくことです。Djangoフォームの初期値を持つValueError

マイ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()は常にクエリセットを返し、フォームは、単一の辞書を期待しているのに対し、values()は、基本的には、その後dictsのリストです。

代わりにr.values()[0]を使用してこれを修正できますが、これは間違ったアプローチです。これはモデル形式です。実際のモデルインスタンスをinstance引数として渡すことによってそれを設定する必要があります。

+0

私はこれを試して、それは動作します!しかし、それは外部キーを埋めることはありません.. – intelis

1

問題はrQuerySetあるinitial=r.values()です。 valuesdictsのリストを返します。initialには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) 
関連する問題