2017-03-15 2 views
0

Ich schreibe ein zweiteiliges Formular, wo ich das Objekt im ersten Teil als OneToOneField für das Objekt im zweiten Teil übergeben wollen.'OneToOneField' Objekt hat kein Attribut 'Get' in funktionsbasierter Ansicht

In views.py:

def object_entry(request): 
    if request.method == 'POST': 
     title_form = TitleEntry(request.POST) 
     object_form = ObjectEntry(request.POST) 
     if title_form.is_valid(): 
      title = title_form.cleaned_data['title'] 
      title_type = title_form.cleaned_data['title_type'] 
      title_lang = title_form.cleaned_data['lang'] 
      title_translation = title_form.cleaned_data['translation'] 
      title_currency = title_form.cleaned_data['currency'] 
      title_level = title_form.cleaned_data['level'] 
      title_note = title_form.cleaned_data['note'] 
      title_source = title_form.cleaned_data['source'] 
      new_title = title_form.save() 
      return new_title 

     else: 
      return render_to_response('objectinfo/objectregister_form.html', {'object_form': object_form, 'title_form': title_form}) 

     if object_form.is_valid(): 
      object_form.preferred_title = new_title 
      snapshot = object_form.cleaned_data['snapshot'] 
      work_type = object_form.cleaned_data['work_type'] 
      source = object_form.cleaned_data['source'] 
      brief_description = object_form.cleaned_data['brief_description'] 
      description_source = object_form.cleaned_data['description_source'] 
      comments = object_form.cleaned_data['comments'] 
      distinguishing_features = object_form.cleaned_data['distinguishing_features'] 
      new_object = object_form.save() 
      reorg.AccessionNumber.generate(new_object.pk) 

      return HttpResponseRedirect('/work/') 
      # return HttpResponseRedirect(reverse(description_edit, args=(new_object.pk,))) 

     else: 
      return render_to_response('objectinfo/objectregister_form.html', {'object_form': object_form, 'title_form': title_form}) 

    else: 
     title_form = TitleEntry() 
     object_form = ObjectEntry() 
     return render(request, 'objectinfo/objectregister_form.html', {'object_form': object_form, 'title_form': title_form}) 

Und in forms.py:

class ObjectEntry(ModelForm): 
    class Meta: 
     model = ObjectRegister 
     fields = ['snapshot', 'work_type', 'source', 'brief_description', 'description_source', 'comments', 'distinguishing_features', 'storage_unit', 'normal_unit'] 

class TitleEntry(ModelForm): 
    class Meta: 
     model = ObjectName 
     fields = ['title', 'title_type', 'lang', 'translation', 'currency', 'level', 'note', 'source'] 

Wenn Sie das Formular absenden er den Fehler 'ObjectName' object has no attribute 'get' zurückgibt. Traceback:

Environment: 

Request Method: POST 
Request URL: http://127.0.0.1:8000/work/add/ 

Django Version: 1.10.6 
Python Version: 3.6.0 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'reversion', 
'historicdate.apps.HistoricdateConfig', 
'place.apps.PlaceConfig', 
'agent.apps.AgentConfig', 
'storageunit.apps.StorageunitConfig', 
'objectinfo.apps.ObjectinfoConfig', 
'reorg.apps.ReorgConfig'] 
Installed Middleware: 
['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'] 

Traceback: 

File "/path/to/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 
    42.    response = get_response(request) 

File "/path/to/venv/lib/python3.6/site-packages/django/utils/deprecation.py" in __call__ 
    138.    response = self.process_response(request, response) 

File "/path/to/venv/lib/python3.6/site-packages/django/middleware/clickjacking.py" in process_response 
    32.   if response.get('X-Frame-Options') is not None: 

Exception Type: AttributeError at /work/add/ 
Exception Value: 'ObjectName' object has no attribute 'get' 

Was wäre der richtige Weg sein passieren new_title als OneToOneField von object_form.preferred_title?

+0

Bitte zeigen Sie die vollständige Traceback. – Alasdair

+2

Alle diese Variablenzuweisungen innerhalb der is_valid-Klauseln scheinen sinnlos zu sein. –

+0

@Alasdair: Danke, siehe bearbeitete Frage –

Antwort

0

Ihre Sicht gibt die neue Instanz zurück, wenn das Formular gültig ist. Das ist falsch, Sie sollten immer eine HTTP-Antwort zurückgeben.

Es ist eine gute Idee, nach der Verarbeitung eines gültigen Formulars umzuleiten, um doppelte Formulareinreichungen zu vermeiden.

+0

Willst du sagen, dass es nicht zwei Formen auf der gleichen Vorlage geben kann, d. H. Ich sollte zuerst eine Seite mit dem Titelformular haben und dann, wenn dieses Formular gespeichert hat, eine separate Seite für das Objektformular anzeigen? –

+0

Es ist möglich, zwei Formulare auf derselben Vorlage zu haben. Wenn Sie eine Antwort zurücksenden, ist es besser umzuleiten, um doppelte Einreichungen zu vermeiden. – Alasdair

+0

Danke. Ich kann immer noch nicht herausfinden, wie man die beiden Formen an der gleichen Vorlage arbeiten lässt, also teile ich sie in zwei separate Ansichten auf und übertrage die ID des ersten als Kwarg an die zweite. –

Verwandte Themen