2017-02-11 1 views
0

나는 Django이라는 예약 앱을 구축 중이며 사용자가 하나의 예약을 다른 예약을위한 템플릿으로 사용할 수있게하려고합니다. 내 아이디어는 ?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() 항상의 검색어를 반환, 그리고 양식이 하나의 DICT 기대되는 반면 values()은 기본적으로 다음 dicts의 목록입니다.

대신 r.values()[0]을 사용하여 문제를 해결할 수 있지만 실제로는 잘못된 방법입니다. 이것은 모델 형식입니다. 실제 모델 인스턴스를 instance 인수로 전달하여이를 채워야합니다.

+0

나는 이것을 시도하고 작동합니다! 하지만 외래 키를 채우지는 못합니다. – intelis

1

문제는 rQuerySet입니다 initial=r.values()이다. valuesdicts의 목록을 반환하고 initialdict을 나타냅니다. 당신은 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) 
관련 문제