簡體   English   中英

Django表單初始的ValueError

[英]ValueError with Django form initial

我正在使用Django構建預訂應用程序,並且希望允許用戶將一個預訂用作另一個預訂的模板。 我的想法是,將?prefill=<reservation_id>添加到url,然后用預prefill ID中的保留數據預填充空表格。

我的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 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

問題是initial=r.values() ,其中rQuerySet values返回一個dicts列表, 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)

filter()總是返回一個查詢集,然后values()基本上是字典列表,而該表單只需要一個字典。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM